使用Numpy数组进行真正除法的问题

时间:2012-10-20 05:18:08

标签: python arrays numpy division

假设你有这个数组:

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]])

但这不起作用。为什么以及如何解决它?

提前致谢。

3 个答案:

答案 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