Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy重新分配变量不会';行不通_Python_Numpy - Fatal编程技术网

Python 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) 第二次打印的结

我试图找到不是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)
第二次
打印的结果
显示变量
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
绑定到python
int
对象。Python
int
s是不可变的。对其进行任何操作的结果总是不同的对象

与其他答案所暗示的相反,
项在循环的第一次迭代中是一个
is
True
:两个名称都绑定到完全相同的
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)]