Python:正确地迭代numpy数组字典
给定以下Python:正确地迭代numpy数组字典,python,arrays,numpy,dictionary,for-loop,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数组的最有效方法是什么 我的尝试失败了,因为我给了它太多的值来解
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
编辑
我不是在寻找每个numpy数组的平均值。我正在寻找我的numpy数组集合中每个元素的平均值。这是一个很小的例子,但我正在处理的实际问题是每个数组有120000多个元素,对于同一位置,值会随着数组的变化而变化 我觉得你让事情变得更难了。求和并除以项数:
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.]])
我觉得你让事情变得更难了。求和并除以项数:
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.]])
你真的不应该使用numpy.array
s的dict
。只需使用多维数组:
>>> 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
。你真的不应该使用numpy.array的dict
。只需使用多维数组:
>>> 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…在mydict.values()中c,v的值:
应该是在mydict.items()中c,v的值:
@JamesR对这一点很有眼光:)我想你只是想要类似于arr.mean(axis=1)
的东西,你到底在找什么?你的产出是多少?为什么这些数组在字典里?说来话长。气候数据…对于mydict.values()中的c,v:
应该是对于mydict.items()中的c,v:
@JamesR很好地注意到了这一点:)我想你只是想要类似于arr.mean(axis=1)
的东西,你到底在找什么?你的产出是多少?为什么这些数组在字典里?说来话长。气候数据…你的第一个答案给了我一个错误<代码>类型错误:不支持/:“dict_values”和“int”的操作数类型。
@kmario23:该错误消息表示左侧操作数是dict_values实例。但是sum(v)
的结果在这里不应该是dict_values对象,所以我不确定您在做什么。我正在尝试执行以下两个步骤:v=mydict.values()
然后是sum(v)/len(v)
和mydict
,如OP所定义。实际上,sum(v)
返回一个类型dict_values
@kmario23:哦,你可能做了一些危险的事情,比如从numpy import*
或者其他什么(或者在某些环境中操作,它们也做了同样的事情)。如果您使用numpy.sum
而不是sum
,则会出现该错误。@kmario23:您的困难与此问题或答案无关,而是与您使用的环境已损坏有关。我们必须更新一半的问题,以便使用sum
或any
或all
或min
或max
或从numpy导入的星号将用不同版本覆盖的任何内置函数。您的第一个答案是给我一个错误<代码>类型错误:不支持/:“dict_values”和“int”的操作数类型。
@kmario23:该错误消息表示左侧操作数是dict_values实例。但是sum(v)
的结果在这里不应该是dict_values对象,所以我不确定您在做什么。我正在尝试执行以下两个步骤:v=mydict.values()
然后是sum(v)/len(v)
和mydict
,如OP所定义。实际上,sum(v)
返回一个类型dict_values
@kmario23:哦,你可能做了一些危险的事情,比如从numpy import*或者其他什么(或者在某些环境中操作,它们也做了同样的事情)。如果您使用numpy.sum
而不是sum
,则会出现该错误。@kmario23:您的困难与此问题或答案无关,而是与您使用的环境已损坏有关。我们必须更新一半的问题,以便使用sum
或any
或all
或min
或max
或从numpy导入的星号将用不同版本覆盖的任何内置函数。