numpy:将垂直数组除以其中一个元素时的意外结果

Qia*_*ian 7 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.
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 6

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

from copy import copy
x /= copy(x[2])
Run Code Online (Sandbox Code Playgroud)

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

In [9]: x = np.random.rand(5,1)
Run Code Online (Sandbox Code Playgroud)

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

In [11]: x /= x[2]
Run Code Online (Sandbox Code Playgroud)

我们最终基本上"查找"x [2]中的值,该值返回一个具有一个值的数组,但因为我们每次都可以更改时查找它.

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

所以在我们做之前x /= x[2]我们可以打电话x = x.flatten()

或者更好,但从一开始就保持1d x = np.random.rand(5)

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