Python numpy can';t为列的一部分赋值

Python numpy can';t为列的一部分赋值,python,numpy,Python,Numpy,当我想给矩阵中的一部分列分配一个向量时,它失败了。下面是一个小例子: >>> 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.525

当我想给矩阵中的一部分列分配一个向量时,它失败了。下面是一个小例子:

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

为什么第一个例子不起作用?我遗漏了什么吗?

当您在数组上使用
[]
时,它将返回您正在引用的数组切片的副本,或者准备分配给该特定切片

因此,当你做
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

当您在数组上使用
[]
时,它将返回您正在引用的数组切片的副本,或者准备分配给该特定切片

因此,当你做
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

声音。如果
slc1
是一个片段(':2'),则间歇值是一个视图,赋值将影响原始数组。当
slc1
是列表或数组时,将生成副本。如果可能,最好使用一组[]进行索引。如果
slc1
是一个切片(':2'),则间歇值是一个视图,赋值会影响原始数组。当
slc1
是列表或数组时,将生成副本。如果可能,最好仍然使用一组[]进行索引。