【问题】
numpy 的 array在使用切片赋值的时候,使用两次切片操作,虽然输出中间结果都是对的,但是最终赋值的结果没有改变原数组。
举个例子:
import numpy as np
A = np.ramdom.random((4,3))
print(A)
# 返回
array([[0.26924955, 0.70513781, 0.56708875],
[0.20262569, 0.22664672, 0.63901124],
[0.38433578, 0.03653372, 0.20559075],
[0.39735781, 0.77549601, 0.17549077]])
x = np.array([1.0,2.0,3.0,4.0]).reshape(-1,1)
x
# 输出:
array([[1.],
[2.],
[3.],
[4.]])
A[:,[0,1]][:,0:1]=x
A
# 输出结果为:
array([[0.26924955, 0.70513781, 0.56708875],
[0.20262569, 0.22664672, 0.63901124],
[0.38433578, 0.03653372, 0.20559075],
[0.39735781, 0.77549601, 0.17549077]])
两次slice操作之后赋值不会影响到原数数组,其实是是只影响最近的一次切片操作。
a = A[:,[0,1]]
a
# 输出结果为:
array([[0.26924955, 0.70513781],
[0.20262569, 0.22664672],
[0.38433578, 0.03653372],
[0.39735781, 0.77549601]])
a[:,0:1]=x
a
# 输出结果为:
array([[1. , 0.70513781],
[2. , 0.22664672],
[3. , 0.03653372],
[4. , 0.77549601]])
# 来看看A,不为所动
A
array([[0.26924955, 0.70513781, 0.56708875],
[0.20262569, 0.22664672, 0.63901124],
[0.38433578, 0.03653372, 0.20559075],
[0.39735781, 0.77549601, 0.17549077]])
所以我就一步步的赋值就好了,先把A切出来,作为一个临时变量,被切出部分赋完值再赋值回去就行。
a = A[:,[0,1]]
a[:,0:1]=x
A[:,[0,1]]=a
A
# 输出A看看:
array([[1. , 0.70513781, 0.56708875],
[2. , 0.22664672, 0.63901124],
[3. , 0.03653372, 0.20559075],
[4. , 0.77549601, 0.17549077]])