numpy的有效向量选择

问题描述

| 有没有一种有效的numpy机制可以从2D数组生成给定数组索引的值数组? 具体来说,我有一个2D坐标的列表,它们表示2D
numpy
数组中的有趣值。我计算这些坐标如下:
nonzerovalidindices = numpy.where((array2d != noDataValue) & (array2d != 0))
nonzerovalidCoordinates = zip(nonzerovalidindices[0],nonzerovalidindices[1])
从那里开始,我通过遍历坐标并一次索引到numpy数组来构建地图,类似于此简化示例:
for coord in nonzerovalidCoordinates:       
    map[coord] = array2d[coord]
我有几个庞大的数据集,正在对该算法进行迭代,因此我对有效的解决方案感兴趣。通过剖析,我怀疑
array2d[coord]
线正在引起一些疼痛。是否有更好的向量形式可以从
array2d
生成值的整个向量,还是我一次只能索引一个?     

解决方法

我认为您可以尝试类似的方法:
array2d[ix_(nonzeroValidIndices[0],nonzeroValidIndices[1])]
或者,如果您真的想使用
nonzeroValidCoordinates
unzip = lambda l: [list(li) for li in zip(*l)]
array2d[ix_(unzip(nonzeroValidCoordinates))]
资料来源:http://www.scipy.org/NumPy_for_Matlab_Users#head-13d7391dd7e2c57d293809cff080260b46d8e664     ,这样的事情怎么样:
a = np.arange(100).reshape((10,10))
ii = np.where(a > 27) # your nonzeroValidIndices
b = np.zeros_like(a) # your map
b[ii] = a[ii]
您可以使用
np.where
的结果对数组进行索引,如上所示。这应该可以完成与不循环的操作类似的操作,但是我不清楚目标2D数组实际上是从您的问题中得出的。不知道ѭ10是什么,似乎就像您将数据复制到相同大小的数组中一样。     ,是的,当然,您可以将值获取为
nonZeroData = array2d[nonzeroValidIndices]
如果map是新的字典,则可以
map = dict(zip(nonzeroValidCoordinates,nonZeroData))
如果这是现有的字典,
map.update(zip(nonzeroValidCoordinates,nonZeroData))
如果是数组,那么
map[nonzeroValidIndices] = nonZeroData