假设你有这个数组:
In [29]: a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]])
Out[30]: a
array([[ 0, 0, 0, 0, 0],
[14, 28, 42, 56, 70],
[18, 36, 54, 72, 90]])
现在将第三行除以第一行(使用将来导入部门)
In [32]: a[0]/a[2]
Out[32]: array([ 0.55555556, 0.55555556, 0.55555556, 0.55555556, 0.55555556])
现在对循环中的每一行执行相同的操作:
In [33]: for i in range(3):
print a[i]/a[2]
[ 0.55555556 0.55555556 0.55555556 0.55555556 0.55555556]
[ 0.77777778 0.77777778 0.77777778 0.77777778 0.77777778]
[ 1. 1. 1. 1. 1.]
一切看起来都很正确。但现在,将第一个数组a [i] / a [2]分配给[i]:
In [35]: for i in range(3):
a[i]/=a[2]
....:
In [36]: a
Out[36]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]])
好吧,没问题。结果是this is by design。相反,我们应该这样做:
In [38]: for i in range(3):
a[i] = a[i]/a[2]
....:
In [39]: a
Out[39]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]])
但这不起作用。为什么以及如何解决它?
提前致谢。
答案 0 :(得分:6)
您可以先将整个数组转换为float
数组:
a = a.astype('float')
a /= a[2]
答案 1 :(得分:4)
“为什么这不起作用” - 它不起作用的原因是因为numpy数组在创建时具有数据类型。任何将不同类型放入该数组的尝试都将转换为适当的类型。换句话说,当您尝试将float放入整数数组时,numpy会将float转换为int。这背后的原因是因为numpy数组被设计成同质类型,以便它们具有最佳性能。换句话说,它们在C中实现为数组。在C中,你不能有一个数组,其中1个元素是float
,下一个是int
。 (你可以拥有struct
的行为,但它们不是数组。)
另一种解决方案(除了@nneonneo提出的解决方案之外)是从一开始就将数组指定为浮点数组:
a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]], dtype=float)
答案 2 :(得分:3)
这不是分裂,而是分配的问题,即a[i] = ...
(当你执行a /= ...
时,它也会在场景后面使用)。试试这个:
>>> a = np.zeros(3, dtype='uint8')
>>> a[:] = [2, -3, 5.9]
>>> print a
[ 2 253 5]
执行intarray[i] = floatarray[i]
时,numpy必须截断浮点值以使其适合intarray
。