我经常使用numpy.where函数来收集具有某些属性的矩阵的索引元组。例如
import numpy as np
X = np.random.rand(3,3)
>>> X
array([[ 0.51035326, 0.41536004, 0.37821622],
[ 0.32285063, 0.29847402, 0.82969935],
[ 0.74340225, 0.51553363, 0.22528989]])
>>> ix = np.where(X > 0.5)
>>> ix
(array([0, 1, 2, 2]), array([0, 2, 0, 1]))
ix现在是包含行和列索引的ndarray对象的元组,而子表达式X>0.5包含单个布尔矩阵,指示哪些单元格具有>0.5属性。每种表述都有其自身的优势。
获取ix对象并在以后需要时将其转换回布尔形式的最佳方法是什么?例如
G = np.zeros(X.shape,dtype=np.bool)
>>> G[ix] = True
有没有一个班轮可以完成同样的事情?
可能是这样的吗?
mask = np.zeros(X.shape, dtype='bool')
mask[ix] = True
但如果它是像X > 0
这样简单的东西,那么你可能最好做mask = X > 0
,除非mask
非常稀疏,或者你不再引用X
。
mask = X > 0
imask = np.logical_not(mask)
例如
编辑:很抱歉之前这么简洁。不应该接电话:P
正如我在示例中指出的,最好只是反转布尔掩码。比从CCD_ 5的结果返回要有效/容易得多。
np.where
文档字符串的底部建议使用np.in1d
。
>>> x = np.array([1, 3, 4, 1, 2, 7, 6])
>>> indices = np.where(x % 3 == 1)[0]
>>> indices
array([0, 2, 3, 5])
>>> np.in1d(np.arange(len(x)), indices)
array([ True, False, True, True, False, True, False], dtype=bool)
(虽然这是一个很好的单行,但它比@Bi-Rico的解决方案慢得多。)