首页 > 解决方案 > 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)

第二个结果print显示变量a已更改为数组[1. 1. 1.],但当我检查它时,仍然是a=1. 为什么?我该如何解决这个问题?

标签: pythonnumpy

解决方案


当你写a = 1的时候,名字a被绑定到一个 pythonint对象上。Pythonint是不可变的。对其进行任何操作的结果总是不同的对象。

与其他答案所暗示的相反,item is a对于True循环的第一次迭代:两个名称都绑定到完全相同的int对象。问题出在线路上item *= np.ones(3)。请记住,该操作返回一个新的 numpy 数组。item然后无论原始绑定是否可变,数组都会绑定到名称。它不会重新绑定名称a,因为您从未告诉过它,因此a仍指原始1.

更改任意命名变量的值的最 Pythonic 方法是将它们放在 a 中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))

请注意,无论是__imul__返回一个新对象(如 for )int还是执行真正的就地操作(如 for ) ,重新分配都会发生在正确的位置np.ndarray


推荐阅读