np.array([0.25, np.array([0.3])])
将无法创建float数组,dtype将为object。
对我来说这似乎是错误的,是故意的吗?
抄送@nschloe ,他反对这种事情,可以联系到他们的问题
感谢CCing。 是的,这确实看起来像是我一直在做的事情。 :smiley_cat: https :
我认为在这里创建对象数组是正确的事情。 毕竟,您要将一个float和一个数组放在一起。 如果您创建了Python列表,
[0.25, np.array([0.3])]
您可能会希望得到相同的结果:第一个条目是一个float,第二个条目是一个长度为1的数组。如果list和np.arrays在这里的行为不同,那将会造成混乱。
同样,在这里隐式创建dtype float数组将使即使我愿意也永远不可能创建[float, vector[1]]
数组。
在大多数情况下,指定np.array([0.25, np.array([0.3])])
是错误地完成的,并且很容易修复。 参见例如https://github.com/scipy/scipy/pull/11147/files#diff -21a6a0b0d89357857304bfba2da5a971L321。 毕竟,
显式胜于隐式。
好,关闭该PR将使最近的NEP 34更改(自恢复以来)对系统的破坏较小。
@nschloe
即使在此处隐式创建dtype float数组,也将永远无法创建[float,vector [1]]数组。
作为记录,您可以执行np.array(0.3, np.array([0.3]), dtype=object)
。
如果您创建了Python列表...
NumPy ndarrays与python列表非常不同。 我不会期望
np.array([0.2, 0.3, 0.4])
会创建一个对象数组,即使我没有为dtype指定np.float64
。 因此,我们同意我们对某种程度的基于值的自动dtype发现感到满意。 问题是应该优先考虑什么:数字类型或对象类型。
因此,我们同意我们对某种程度的基于值的自动dtype发现感到满意。
我认为这里的“自动化”非常清楚:始终获取可以捕获所有输入值的“最低”数据类型:
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