3

假设你有这个数组:

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

现在将第三行除以第一行(使用 from future import division)

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] 分配给 a[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]])

好吧,没问题。原来这是设计使然。相反,我们应该这样做:

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

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

提前致谢。

4

3 回答 3

6

您可以先将整个数组转换为float数组:

a = a.astype('float')
a /= a[2]
于 2012-10-20T05:21:56.400 回答
4

“为什么这不起作用” - 它不起作用的原因是因为 numpy 数组在创建时具有数据类型。任何将不同类型放入该数组的尝试都将被强制转换为适当的类型。换句话说,当您尝试将浮点数放入整数数组时,numpy 会将浮点数转换为 int。这背后的原因是因为 numpy 数组被设计为同质类型,以使它们具有最佳性能。换句话说,它们在 C 中被实现为数组。在 C 中,你不能有一个数组,其中 1 个元素是 afloat而下一个元素是 a int。(你可以有structs 的行为,但它们不是数组)。

另一种解决方案(除了@nneonneo 提出的解决方案)是从一开始就将数组指定为浮点数组:

a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]], dtype=float)
于 2012-10-20T05:33:06.757 回答
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.

于 2012-10-20T05:39:00.487 回答