np.array([0.25, np.array([0.3])])
falhará ao criar um array float, o dtype será objeto.
Isso me parece errado, é intencional?
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