在给定该数组的索引列表的情况下,是否有一个有效的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
的整个值向量,还是我一次只能索引一个?
答案 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