当我想将一个向量分配给矩阵中的一部分列时,它失败了。这是一个小例子:
>>> a = np.random.randn(3,4)
>>> a
array([[ 0.12263942, -0.21972043, -0.97263544, 0.10609172],
[ 0.27012565, 1.0006549 , 0.80596588, -0.2954019 ],
[-0.28402912, -2.62405207, -0.52560166, 0.07325703]])
>>> x
array([-0.33707461, 0.66196137])
>>> a[np.array([0,2])][:,2] = x
>>> a[np.array([0,2])][:,2]
array([-0.97263544, -0.52560166])
但这有效:
>>> a = np.random.randn(3,4)
>>> a
array([[ 0.45379867, 0.38782073, -0.01432557, -1.03457707],
[ 1.27650459, 0.4480737 , -1.31625142, 2.00037792],
[ 0.77420762, 1.20131941, -0.98937721, -0.04921255]])
>>> x2 = np.random.randn(3)
>>> x2
array([-1.82217731, -0.72454628, -0.41954297])
>>> a[:,2] = x2
>>> a[:,2]
array([-1.82217731, -0.72454628, -0.41954297])
为什么第一个例子不起作用?我错过了什么吗?
答案 0 :(得分:1)
在数组上使用[]
时,它将返回您正在引用的数组切片的副本,或者准备分配给该特定切片。
因此当您执行a[slc1][slc2] = stuff
时,a[slc1]
现在是a
的副本,将其称为a_
,以便a[slc1][slc2]
与a_[slc2]
相同}}
然后您分配给a[slc1][slc2] = stuff
与a_[slc2] = stuff
相同的副本。哪个没问题,但是你已经分配了一个只是临时创建的变量。
而是在同一作业中进行作业
a[slc1, slc2] = stuff
或者在你的情况下
a[[0, 2], 2] = x
使用(a[[0, 2], 2] == x).all()
检查将返回True