In [59]: one=np.arange(6).reshape(2,3)
In [60]: two=np.arange(6).reshape(2,3)
暂时忘记循环,尝试更改one:
In [61]: arr = one
In [62]: arr=np.column_stack([arr,5*arr[:,2]-arr[:,1]])
In [63]: arr
Out[63]:
array([[ 0, 1, 2, 9],
[ 3, 4, 5, 21]])
In [65]: one
Out[65]:
array([[0, 1, 2],
[3, 4, 5]])
此操作已更改 arr,但未更改 one。最初 arr 引用了与 one 相同的对象 (ndarray),但在新赋值之后,它引用了一个新数组。
在
for arr in alist:
arr = ....
arr 被分配了一个元素 alist。但是在循环中它被分配了另一个东西,而不改变原始对象。在下一次迭代中,arr 被分配到列表中的下一个元素,依此类推。
您需要记住几件事。
- Python 如何为变量赋值
- Python 如何为迭代变量赋值
-
column_stack 之类的函数
在你之前的问题中
In [69]: for arg in [one,two]:
...: arg[:,1:] += 10
...:
In [70]: one
Out[70]:
array([[ 0, 11, 12],
[ 3, 14, 15]])
In [71]: two
Out[71]:
array([[ 0, 11, 12],
[ 3, 14, 15]])
这是因为arg[:,1:] += 10 正在修改当前分配给arg 的数组。一个数组是mutable;元素值可以就地更改。
np.column_stack() 不会就地执行。它创建了新数组。
关于使用列表更改 one 和 two 的唯一方法是以下操作序列:
In [72]: newlist=[np.column_stack([arr,5*arr[:,2]-arr[:,1]]) for arg in [one,two]]
In [73]: newlist
Out[73]:
[array([[ 0, 1, 2, 9, 9],
[ 3, 4, 5, 21, 21]]), array([[ 0, 1, 2, 9, 9],
[ 3, 4, 5, 21, 21]])]
In [74]: one
Out[74]:
array([[ 0, 11, 12],
[ 3, 14, 15]])
In [75]: one, two = newlist
In [76]: one
Out[76]:
array([[ 0, 1, 2, 9, 9],
[ 3, 4, 5, 21, 21]])
In[72] 创建一个带有新数组的新列表。 In[75] 将这些新数组分配给变量one 和two。这抹去了他们以前的参考资料。实际上我做了one=[np.column_stack([one,5*one[:,2]-one[:,1]]),同样的two。