级联numpy logical_and会导致内存错误

时间:2014-04-03 18:18:04

标签: python arrays numpy

对于GIS问题,我在gdal_calc.py内使用numpy并立即遇到MemoryError。我的目标是比较多个(最多500个)相同长度的数组,以查看哪个数组在特定索引处包含最高值 - 并返回一个相同长度的数组,其中包含与之关联的idcodes(首先,如果有多个)赢得“阵列。

假设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

我希望我的解释和代码示例有意义 - 它肯定看起来很难看(尤其是在扩大规模时)。它会立即创建MemoryErrors。任何人都可以建议一个更好的方法来编码吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

为什么不将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.argmax(axis=0)会为y中的哪个数组提供每个索引的最高值。例如,数组455(由于0索引而为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']