Python Numpy重新分配变量不会';行不通
我试图找到不是Numpy数组的变量,并通过以下方式将它们更改为数组:Python Numpy重新分配变量不会';行不通,python,numpy,Python,Numpy,我试图找到不是Numpy数组的变量,并通过以下方式将它们更改为数组: import numpy as np a = 1 b = np.array([1,2,3]) c = np.array([1,2,3]) for item in a, b, c: if type(item) != np.ndarray: print(item) item *= np.ones(3) print(item) 第二次打印的结
import numpy as np
a = 1
b = np.array([1,2,3])
c = np.array([1,2,3])
for item in a, b, c:
if type(item) != np.ndarray:
print(item)
item *= np.ones(3)
print(item)
第二次打印的结果
显示变量a
已更改为数组[1.1.1.]
,但当我检查它时,仍然是a=1
。
为什么?如何解决此问题?for循环变量
项
在第一次循环迭代期间存储a
的值。然后,当修改项
时,a
不会更新,因为项
只存储a
的值,而不存储其引用。换句话说,a
和item
存储相同的值,但存储在不同的存储位置
在开始迭代之前,我会将变量存储到列表中,并执行以下操作:
import numpy as np
a=1
b = np.array([1,2,3])
c = np.array([1,2,3])
L = [a, b, c]
for i in range(len(L)):
if type(L[i]) != np.ndarray:
print(L[i])
L[i] *= np.ones(3)
print(L[i])
print(L)
打印
L
时,所有元素都应该是numpy数组。这是因为在for循环中,它通过索引引用访问列表中的元素。当您编写a=1
时,名称a
绑定到pythonint
对象。Pythonint
s是不可变的。对其进行任何操作的结果总是不同的对象
与其他答案所暗示的相反,项在循环的第一次迭代中是一个
isTrue
:两个名称都绑定到完全相同的int
对象。问题在于行item*=np.ones(3)
。请记住,该操作将返回一个新的numpy数组。然后将数组绑定到名称项
,而不管原始绑定是否可变。它不会重新绑定名称a
,因为您从未告诉过它,所以a
仍然引用原始的1
更改任意命名变量的值的最简单的方法是将它们放入一个dict
:
myvars = {
'a': 1,
'b': np.array([1,2,3]),
'c': np.array([1,2,3]),
}
for name in myvars:
...
myvars[name] *= np.ones(3)
...
这是因为行myvars[name]*=np.ones(3)
大致相当于
myvars[name] = operator.__imul__(myvars[name], np.ones(3))
请注意,无论
是否返回新对象(如int
)或执行真正的就地操作(如np.ndarray
),重新分配都会发生在正确的位置。我想您至少会发现1d
很有指导意义。首先是其代码:
def atleast_1d(*arys):
res = []
for ary in arys:
ary = asanyarray(ary)
if ary.ndim == 0:
result = ary.reshape(1)
else:
result = ary
res.append(result)
if len(res) == 1:
return res[0]
else:
return res
您的样品:
In [11]: a = 1
...: b = np.array([1,2,3])
...: c = np.array([1,2,3])
它返回一个数组列表,每个数组对应一个输入:
In [12]: np.atleast_1d(a,b,c)
Out[12]: [array([1]), array([1, 2, 3]), array([1, 2, 3])]
然后可以使用解包来重新分配变量:
In [13]: a,b,c = np.atleast_1d(a,b,c)
In [14]: a
Out[14]: array([1])
由于它使用asanyarray
,因此不会复制b
和c
数组(甚至不会复制视图)
它不能完全产生你想要的东西,一个与b
或c
大小相同的数组,但它可以调整以实现这一点。你的开头段落不正确<代码>a
和项
是相同的参考:a是项
是真的
。问题是您重新分配了项
,但没有重新分配a
。是否必须更改a
?制作一个新的列表怎么样,例如,[np.asarray(item)(a,b,c)]