Python:正确迭代numpy数组的字典

时间:2017-03-20 21:07:12

标签: python arrays numpy dictionary for-loop

给出以下numpy数组:

import numpy
a=numpy.array([[1,1,1],[1,1,1],[1,1,1]])
b=numpy.array([[2,2,2],[2,2,2],[2,2,2]])
c=numpy.array([[3,3,3],[3,3,3],[3,3,3]])

这个包含所有字典的字典:

mydict={0:a,1:b,2:c}

迭代mydict的最有效方法是什么,以便计算以(1+2+3)/3=2为值的平均numpy数组?

我尝试失败,因为我给它太多的值来解压缩。它的效率非常低,因为它具有O(n^3)时间复杂度:

aver=numpy.empty([a.shape[0],a.shape[1]])

for c,v in mydict.values():
    for i in range(0,a.shape[0]):
        for j in range(0,a.shape[1]):
            aver[i][j]=mydict[c][i][j] #<-too many values to unpack

最终结果应为:

In[17]: aver
Out[17]: 
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

修改

我不是在寻找每个numpy数组的平均值。我正在寻找我的numpy数组的每个元素的平均值。这是一个最小的例子,但我正在处理的真实事物每个数组有超过120,000个元素,对于相同的位置,值从数组变为数组。

2 个答案:

答案 0 :(得分:1)

我认为你正在努力实现这一目标。将它们相加并除以项数:

In [42]: v = mydict.values()

In [43]: sum(v) / len(v)
Out[43]: 
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

或者将它们堆叠成一个大的阵列 - 它听起来就像它们可能应该开始的格式 - 并且在堆叠轴上取平均值:

In [44]: np.array(list(v)).mean(axis=0)
Out[44]: 
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

答案 1 :(得分:1)

你真的不应该使用dict numpy.array。只需使用多维数组:

>>> bigarray  = numpy.array([arr.tolist() for arr in mydict.values()])
>>> bigarray
array([[[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [3, 3, 3]]])
>>> bigarray.mean(axis=0)
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>>

您应修改代码,使其无法使用dict。特别是不是带有整数键的dict ...