Python 级联numpy逻辑单元并导致内存错误

Python 级联numpy逻辑单元并导致内存错误,python,arrays,numpy,Python,Arrays,Numpy,对于GIS问题,我在gdal_calc.py中使用numpy并运行到即时内存错误中。我的目标是比较多个多达500个相同长度的数组,以查看哪个数组在特定索引处包含最高值,并返回一个相同长度的数组,其中IDCODE与第一个数组关联,以防有多个获胜的数组 假设AA=[1,3,2,8,9]和AB=[4,1,3,9,7]且AC=[2,1,3,10,8],预期结果为[idcodeAB,idcodeAA,idcodeAB,idcodeAC,idcodeAA] 这是我的numpy代码: logical_and(

对于GIS问题,我在gdal_calc.py中使用numpy并运行到即时内存错误中。我的目标是比较多个多达500个相同长度的数组,以查看哪个数组在特定索引处包含最高值,并返回一个相同长度的数组,其中IDCODE与第一个数组关联,以防有多个获胜的数组

假设AA=[1,3,2,8,9]和AB=[4,1,3,9,7]且AC=[2,1,3,10,8],预期结果为[idcodeAB,idcodeAA,idcodeAB,idcodeAC,idcodeAA]

这是我的numpy代码:

logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(AA>=AB,AA>=AC),AA>=AD),AA>=AE),AA>=AF),AA>=AG),AA>=AH),AA>=AI),AA>=AJ),AA>=AK),AA>=AL) * idcodeAA + 
logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(AB>=AA,AB>=AC),AB>=AD),AB>=AE),AB>=AF),AB>=AG),AB>=AH),AB>=AI),AB>=AJ),AB>=AK),AB>=AL) * idcodeAB + 
logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(logical_and(AC>=AA,AC>=AB),AC>=AD),AC>=AE),AC>=AF),AC>=AG),AC>=AH),AC>=AI),AC>=AJ),AC>=AK),AC>=AL) * idcodeAC
我希望我的解释和代码示例是有意义的——它看起来确实很难看,尤其是放大的时候。它会立即产生记忆错误。有谁能建议一种更好的编码方法吗?提前谢谢

为什么不np.vstack将数组放在一起,并在每个索引上使用argmax?比如说

>>> import numpy as np
>>> # 500 arrays of random numbers
>>> x = [np.random.rand(100) for _ in xrange(500)]
>>> y = np.vstack(x)
>>> y.shape
(500, 100)

>>> y.argmax(axis=0)
array([454,  94, 197,  47, 102, 359, 480, 432, 101, 383, 441, 358,  32,
       474, 476,  94, 454, 227, 327, 336, 302, 114, 368,  41, 362, 136,
       337, 439, 313, 259, 270, 132, 494, 264, 393, 264, 153, 290, 497,
       256, 231, 277, 455,  70, 288, 173, 499,  91, 256, 388, 284, 348,
       123, 482,  72, 153, 347, 113,  24, 141,  68, 440, 244, 113,  69,
        30, 472, 152, 106, 453,  13, 134, 169, 205, 317, 127, 248, 352,
        25, 445, 470, 167,  51, 183,  95, 462, 394, 491, 384, 150, 192,
       129, 407,  34, 249, 450, 398, 332, 142, 179])

>>> y.argmax(axis=0).shape
(100,)
因此,y.argmaxaxis=0给出y中的哪个数组在每个索引处的值最高。例如,由于0索引,数组455 454+1在索引0 y[454,0]>=y[:,0]处具有最高值

然后你可以做类似的事情

np.array([y[i] * id for i, id in zip(y.argmax(axis=0), idcodes)]).sum(axis=0)
编辑:

例如:使用编辑:

In [24]: labels = 'ABC' #each label corresponds to one array in x
In [25]: x = [[1,3,2,8,9], [4,1,3,9,7], [2,1,3,10,8]]
In [26]: y = np.array(x)
In [27]: y.argmax(axis=0)
Out[27]: array([1, 0, 1, 2, 0])
In [28]: [labels[i] for i in y.argmax(axis=0)]
Out[28]: ['B', 'A', 'B', 'C', 'A']

太快了,谢谢你!我的python技能足以满足您答案的第一部分,但不能满足额外的一行。在我仔细考虑的时候,下面的工作可能会起作用:数组[idcodeAA,idcodeAB,idcodeAC][argmax[[AA],[AB],[AC]],axis=0]它确实起作用-太棒了!谢谢你让我走上正轨!啊,现在我明白了-这个解决方案看起来更好。。。再次感谢!