【问题标题】:Python: properly iterating through a dictionary of numpy arraysPython:正确遍历numpy数组的字典
【发布时间】:2017-08-12 08:14:10
【问题描述】:

给定以下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 个元素,并且对于相同的位置,值会从数组变为数组。

【问题讨论】:

  • for c,v in mydict.values(): 应该是 for c,v in mydict.items():
  • @JamesR 好好看看那个 :)
  • 我想你只是想要像arr.mean(axis=1)这样的东西
  • 您到底在寻找什么?你的输出是什么?为什么这些数组在字典中?
  • 说来话长。气候数据...

标签: python arrays numpy dictionary for-loop


【解决方案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.]])

【讨论】:

  • 您的第一个答案是给我一个错误。 TypeError: unsupported operand type(s) for /: 'dict_values' and 'int'
  • @kmario23:该错误消息表明左侧操作数是 dict_values 实例。但是sum(v)的结果不应该是这里的dict_values对象,所以我不确定你在做什么。
  • 我正在尝试执行这两个步骤:v = mydict.values() 后跟 sum(v) / len(v)mydict OP 定义。实际上,sum(v) 返回一个类型 dict_values
  • @kmario23: 哦,你可能做了一些危险的事情,比如from numpy import * 或其他东西(或者在一些做同样事情的环境中运行)。如果你使用numpy.sum 而不是sum,它会给你这个错误。
  • @kmario23:您的困难与这个问题或答案无关,而是与您使用的环境损坏有关。我们必须更新关于 SO 的一半问题,这些问题使用 sumanyallminmax 或任何从 numpy 导入的星号将覆盖的内置函数版本。
【解决方案2】:

你真的不应该使用dictnumpy.arrays。只需使用多维数组即可:

>>> 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...

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多