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)
第二个结果print
显示变量a
已更改为数组[1. 1. 1.]
,但当我检查它时,仍然是a=1
. 为什么?我该如何解决这个问题?
解决方案
当你写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
。
推荐阅读
- javascript - 从 youtube 视频中获取缩略图
- flutter - 有没有办法只授权现有帐户的用户?
- java - ViewModel/LiveData/Observer 设计
- amazon-web-services - Amazon SQS - FIFO 队列 - 如何配置内部重复数据删除?
- javascript - 使用 javascript 将类添加到选项卡的问题
- scala - Scala Dataframe/SQL:报告的动态列选择
- javascript - Ruby on Rails - 您能否仅使用 jsPDF 将“html.erb”视图生成为可下载的 PDF?
- dart - 在飞镖中解码 JSON
- php - 使用 PHP 从标签名中带有冒号的 RSS 提要获取附件标签
- python - 如何从字典中为 LogisticRegression 赋值?