Python 迭代存储为不同变量的一组numpy数组

Python 迭代存储为不同变量的一组numpy数组,python,numpy,Python,Numpy,我想遍历一系列numpy数组,这些数组的变量名如下 numpy_array_001, numpy_array_002, ... numpy_array_N 要把它们加起来,我需要的是: sum += "numpy_array_"+str(number) for i in range(N): eval('sum += numpy_array_' + '{:03}'.format(i+1)') 上面提到的问题是,“num\u pyarray\uu”+str(number)变成了一

我想遍历一系列numpy数组,这些数组的变量名如下

numpy_array_001, numpy_array_002, ... numpy_array_N
要把它们加起来,我需要的是:

sum += "numpy_array_"+str(number) 
for i in range(N):  
    eval('sum += numpy_array_' + '{:03}'.format(i+1)')
上面提到的问题是,
“num\u pyarray\uu”+str(number)
变成了一个字符串,不再是一个数组,因此不起作用

如何重写最后一行以将数组添加到一起

预期的结果是

sum = numpy_array_001 + numpy_array_002+ ... + numpy_array_N

对于任何N

,将其放入列表并使用列表理解:

all_arrays = [] # empty list

# you just append the arrays once you know them.
# no need to keep track of the name at all
all_arrays.append(array_001)
all_arrays.append(array_002)

sum_total = sum([np.sum(k) for k in all_arrays])

如果你把它们放在字典里,那么你可以随意地对它们进行迭代,因为键是一个字符串

类似于
Dic={“numpy\u array\u 001”:numpy\u array\u 001,…。}


然后执行
sum+=Dict[“numpy\u数组”+str(number)

除非使用
eval
exec
,否则Python不支持变量名。这两种方法都不推荐。在这种情况下,你实际上不需要它们

您只需将所有数组放在一个列表中,然后迭代该列表:

list_of_arrays = [numpy_array_001, numpy_array_002, ..., numpy_array_N]
然后,您可以使用生成器表达式和内置的
sum
函数计算所有总和:

sum(arr.sum() for arr in list_of_arrays)
或按元素求和:

res = list_of_arrays[0].copy()
for arr in list_of_arrays[1:]:
    res += arr
或者更简单(但它将创建更多的中间数组):


如果您确实想避免使用
列表
并使用变量名,您可以这样做:

expression = '+'.join('numpy_array_{:0>3}'.format(i) for i in range(1, N+1))
res = eval(expression)
例如:

N = 3
numpy_array_001 = np.ones((3, 3))
numpy_array_002 = np.ones((3, 3))*2
numpy_array_003 = np.ones((3, 3))*3
expression = '+'.join('numpy_array_{:0>3}'.format(i) for i in range(1, N+1))
eval(expression)
# array([[ 6.,  6.,  6.],
#        [ 6.,  6.,  6.],
#        [ 6.,  6.,  6.]])

然而,必须使用
eval
表明您没有选择最佳方法。只有少数情况下必须使用
eval
。但在这里,您确实应该使用列表或其他容器进行迭代。

对不起,我认为您必须使用

下面是一个简单的例子,其中我有三个变量(
x1
x2
x3
),我将它们相加:

x1 = 1
x2 = 2
x3 = 3

# Make an string containing the expression to evaluate
expr=''
for i in range(3):
  expr = expr + 'x' + str(i+1) + ' + '
expr = expr[0:-3] # remove the last ' + '

# Show the expression, and evaluate it
print(expr)
eval(expr)
您可以改为执行
sum+=
。比如:

sum += "numpy_array_"+str(number) 
for i in range(N):  
    eval('sum += numpy_array_' + '{:03}'.format(i+1)')

但实际上,如果你能控制它,你应该设计你的程序,这样它就不会把一堆数组存储在像那样的独立变量中。这只会让你的生活变得困难。

为什么不把所有这些数组放在一个列表中,然后使用
sum(arr.sum()表示数组列表中的arr)
。不确定你想要什么结果,因为你没有包括输入和预期结果。OP的要求很清楚。他有一堆名称相似的变量(只有最后三个字符是不同的),他希望在循环中对它们进行迭代以求和(或将它们串联起来,或其他)。我认为唯一的方法是使用
eval()
。你确定这就是我们想要的吗?我故意把它作为评论发布,因为这个问题不清楚预期结果。不是100%,但让我们看看OP是怎么想的。对不起,你的意思是用python代码写省略号,还是OP应该手动将它们放在列表中@JoeNo,没有省略号。我只是从原来的帖子上抄下来的。OP应该手动将列表放在一起。这将问题转移到:如果数组N的数量事先未知,如何创建“所有数组”列表?我只知道如何为字符串创建它,即“numpy_array_001”,但不知道numpy objects numpy_array_001谢谢,这将问题转移到:如果数组的数量事先未知,我如何创建列表“list_of_array”?@FabriceSchlegel取决于您最初创建变量的“方式”。只需创建一个列表即可。冗长,但这是将字符串(变量名)与对象匹配的最佳方法。