循环vs批量算术

时间:2014-02-22 20:10:31

标签: python for-loop

我在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行,那么结果 翻了。

2 个答案:

答案 0 :(得分:4)

此行不会生成两个单独的数组AB,它会生成一个数组并生成两个名称AB,请参阅该数组:

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时会感到困惑......