这是我之前一个问题的后续帖子:Referring to arrays in a for-loop .
我想概括那里提出的解决方案,以便能够完成更复杂的任务,例如将一列附加到包含某些计算结果的每个数组:
import numpy as np
list=[one, two, three]
for arr in list:
arr=np.column_stack([arr,5*arr[:,2]-arr[:,1])])
所有三个数组具有相同的维度。
最佳答案
In [59]: one=np.arange(6).reshape(2,3)
In [60]: two=np.arange(6).reshape(2,3)
暂时忘掉循环,试着改变一个
:
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
,但未更改一个
。本来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
的数组。数组是可变的
;元素值可以就地更改。
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
也是如此.
关于python - 在对每个数组进行更改时迭代数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49059917/