我在python中使用for循环时遇到了一些麻烦。我的目标是遍历一组数据并对每个元素执行算术运算。这是一个例子
import numpy as np
X = np.array([[6.3, 7.4, 4.2], [2.6, 7.8, 9.1], [1.7, 3.9, 6.4]])
A = B = np.zeros((len(X), len(X)))
# Method One
for i in range(len(X)):
for j in range(len(X)):
A[i][j] = X[i][j] + 2 * 5
B[i][j] = X[i][j] + 8
# Method Two
A2 = X + 2 * 5
B2 = X + 8
print "A"
print A
print A2
print A == A2
print "B"
print B
print B2
print B == B2
方法一: 这里的想法是我会循环 通过每个元素
方法二: 通过这种方式,它可以立即完成
我不仅仅使用方法二的原因是对于某些值我想要做不同的操作,所以我的想法是使用for循环并在执行操作之前检查每个值。我很困惑为什么这两种方法产生不同的结果。
如果我切换第9/10行,那么结果 翻了。
答案 0 :(得分:4)
此行不会生成两个单独的数组A
和B
,它会生成一个数组并生成两个名称A
和B
,请参阅该数组:
A = B = np.zeros((len(X), len(X)))
例如:
>>> A = B = np.zeros((3,3))
>>> A is B
True
>>> A[0,0] = 99
>>> A
array([[ 99., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> B
array([[ 99., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
因此,在这些方面:
A[i][j] = X[i][j] + 2 * 5
B[i][j] = X[i][j] + 8
你也可以写
A[i][j] = X[i][j] + 2 * 5
A[i][j] = X[i][j] + 8
这就是订单重要的原因;他们都设置了同一个数组的同一个单元格,所以最后一个是你看到的那个。
答案 1 :(得分:0)
您需要创建两个数组:而不是
A = B = np.zeros((len(X), len(X)))
DO
A = np.zeros((len(X), len(X)))
B = np.zeros((len(X), len(X)))
你正在创建两个指向同一个对象的变量 - 所以不管你做了什么,这就是你得到的......在Python中,表达式
A = B
意思是“从现在开始,当我说'A'时,我的意思是'B'”。当你来自Matlab时会感到困惑......