对于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。任何人都可以建议一个更好的方法来编码吗?提前谢谢!
答案 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']