Numpy: ERRO: a descoberta de dimensão falha ao misturar escalares e matrizes de forma == (1,)

Criado em 9 dez. 2019  ·  5Comentários  ·  Fonte: numpy/numpy

np.array([0.25, np.array([0.3])]) falhará ao criar um array float, o dtype será objeto.

Isso me parece errado, é intencional?

00 - Bug numpy.dtype

Todos 5 comentários

Cc @nschloe , que é contra esse tipo de coisa e pode criar um link para o problema deles

Obrigado por CCing. Sim, isso realmente parece algo sobre o qual estou falando. : smiley_cat: https://github.com/numpy/numpy/issues/10404

Eu diria que criar uma matriz de objetos é a coisa correta aqui. Afinal, você está colocando um float e um array juntos. Se você criou uma lista Python,

[0.25, np.array([0.3])]

você esperaria a mesma coisa: a primeira entrada é um float, a segunda uma matriz de comprimento 1. Seria confuso se as listas e np.arrays se comportassem de maneira diferente aqui.

Além disso, criar implicitamente um array float dtype aqui tornaria impossível criar um array [float, vector[1]] mesmo se eu quisesse.

Na maioria das vezes, a especificação de np.array([0.25, np.array([0.3])]) é feita por engano e pode ser facilmente corrigida; consulte, por exemplo, https://github.com/scipy/scipy/pull/11147/files#diff -21a6a0b0d89357857304bfba2da5a971L321. Depois de tudo,

Explícito é melhor do que implícito.

OK, fechando. Esse PR teria tornado as alterações recentes do NEP 34 (desde a reversão) menos perturbadoras para o scipy.

@nschloe

criar implicitamente um array float dtype aqui tornaria impossível criar um array [float, vetor [1]] mesmo se eu quisesse.

Para registro, você poderia fazer np.array(0.3, np.array([0.3]), dtype=object) .

Se você criou uma lista Python ...

Os ndarrays NumPy são muito diferentes das listas python. Eu não teria nenhuma expectativa de que
np.array([0.2, 0.3, 0.4]) criaria uma matriz de objeto, embora eu não tenha especificado np.float64 para o tipo de d. Portanto, concordamos que estamos confortáveis ​​com algum nível de descoberta automática de tipo dtipo baseada em valor. A questão é o que deve ganhar precedência: tipos numéricos ou tipos de objetos.

Portanto, concordamos que estamos confortáveis ​​com algum nível de descoberta automática de tipo dtipo baseada em valor.

A "automação" é bastante clara aqui, eu acho: sempre obtenha o tipo de dados "mais baixo" que pode capturar todos os valores de entrada:

numpy.array([1, 2]).dtype   # int64
numpy.array([1, numpy.array(2)]).dtype  # int64, array of rank 0 are basically scalars
numpy.array([1.0, 2]).dtype   # float64
numpy.array([1, [2]]).dtype   # O
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kevinzhai80 picture kevinzhai80  ·  4Comentários

MareinK picture MareinK  ·  3Comentários

inducer picture inducer  ·  3Comentários

thouis picture thouis  ·  4Comentários

Levstyle picture Levstyle  ·  3Comentários