使用掩码获取2D NumPy数组的特定值的位置

时间:2014-05-11 09:42:16

标签: python arrays coordinates mask

我需要一些帮助来检测2D数组的所有值(坐标),以验证特定的条件。

我已经问了一个类似的问题,但现在我掩盖了一些我不感兴趣的特定价值观...... 上次,有人建议使用zip(*np.where(test2D < 5000.))

例如:

import numpy as np

test2D = np.array([[  3051.11,   2984.85,   3059.17],
       [  3510.78,   3442.43,   3520.7 ],
       [  4045.91,   3975.03,   4058.15],
       [  4646.37,   4575.01,   4662.29],
       [  5322.75,   5249.33,   5342.1 ],
       [  6102.73,   6025.72,   6127.86],
       [  6985.96,   6906.81,   7018.22],
       [  7979.81,   7901.04,   8021.  ],
       [  9107.18,   9021.98,   9156.44],
       [ 10364.26,  10277.02,  10423.1 ],
       [ 11776.65,  11682.76,  11843.18]])

所以我可以获得所有验证的位置&lt; 5000:

positions=zip(*np.where(test2D < 5000.))

现在我想拒绝一些对我来说无用的值(它是一个带坐标的数组):

rejectedvalues = np.array([[0, 0], [2, 2], [3, 1], [10, 2]])
i, j = rejectedvalues.T

mask = np.zeros(test2D.shape, bool)
mask[i,j] = True
m = np.ma.array(test2D, mask=mask)

positions2=zip(*np.where(m < 5000.))

但是position2给了我与位置相同的东西......

1 个答案:

答案 0 :(得分:1)

np.ma.where尊重掩码 - 它不会返回被屏蔽的条件中的索引(例如m < 5000.)。

In [58]: np.asarray(np.column_stack(np.ma.where(m < 5000.)))
Out[58]: 
array([[0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [3, 0],
       [3, 2]])

将其与使用np.where的类似表达式进行比较:

In [57]: np.asarray(np.column_stack(np.where(m < 5000.)))
Out[57]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2],
       [3, 0],
       [3, 1],
       [3, 2]])