给出以下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个元素,对于相同的位置,值从数组变为数组。
答案 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
...