所以,我创建了一个垂直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.
答案 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
它会工作