numpy:将垂直数组除以其自身元素之一时出现意外结果

时间:2016-03-08 14:47:33

标签: python arrays numpy

所以,我创建了一个垂直numpy数组,使用了/ =运算符,输出似乎不正确。 基本上,如果x是向量,则是标量。我希望x / = s的每个条目x除以s。但是,我无法理解输出。运算符仅适用于x中的部分条目,我不确定它们是如何被选中的。

In [8]: np.__version__
Out[8]: '1.10.4'

In [9]: x = np.random.rand(5,1)

In [10]: x
Out[10]:
array([[ 0.47577008],
       [ 0.66127875],
       [ 0.49337183],
       [ 0.47195985],
       [ 0.82384023]])   ####

In [11]: x /= x[2]

In [12]: x
Out[12]:
array([[ 0.96432356],
       [ 1.3403253 ],
       [ 1.        ],
       [ 0.95660073],
       [ 0.82384023]])   #### this entry is not changed.

2 个答案:

答案 0 :(得分:6)

在评估过程中,x [2]的值变为1。你需要制作一个值的副本然后将每个元素除以它,或者将它分配给另一个变量或使用副本,即

from copy import copy
x /= copy(x[2])

要理解为什么我们需要这样做,让我们深入了解正在发生的事情。

In [9]: x = np.random.rand(5,1)

这里我们将x定义为一个数组,但是并不清楚这个数组中的每个元素在技术上也是一个数组。这是一个重要的区别,因为我们不是处理定义的值而是处理numpy数组对象,所以在下一行:

In [11]: x /= x[2]

我们最终基本上会向上看' x [2]中的值返回一个带有一个值的数组,但因为每次可以更改时我们都会查找它。

一个更清洁的解决方案是将数组展平为1d,因此x [2]现在等于0.49337183而不是数组([0.49337183])

因此,在我们x /= x[2]之前,我们可以致电x = x.flatten()

或者更好的是从开始{1}}

开始保持1d

至于x [3]改变而x [4]没有改变的原因,我能给出的唯一真正有用的答案是分裂不是按顺序发生的,复杂的缓冲时间很长的wimey东西。

答案 1 :(得分:0)

理论上它只适用于奇数大小的矢量,但如果你这样做: x = np.random.rand(5,1) a = x[2]*1 x/=a 它会工作