numpy中的高效矢量选择

时间:2011-04-12 22:09:42

标签: python 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的整个值向量,还是我一次只能索引一个?

3 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

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数组实际上是从你的问题中得到的。不知道map是什么,似乎就像你将数据复制到相同大小的数组中一样。

答案 1 :(得分:2)

是的,当然,您可以将值设为

nonZeroData = array2d[nonzeroValidIndices]

如果地图是新的字典,你可以做

map = dict(zip(nonzeroValidCoordinates,nonZeroData))

如果是现有的词典,

map.update(zip(nonzeroValidCoordinates,nonZeroData))

如果是数组,那么

map[nonzeroValidIndices] = nonZeroData

答案 2 :(得分:1)

我认为你可以尝试类似的东西:

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