我需要一些帮助来检测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给了我与位置相同的东西......
答案 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]])