如何反转numpy.where(np.where)函数

时间:2012-02-29 17:09:57

标签: python numpy boolean where indices

我经常使用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

是否有一个单行完成同样的事情?

4 个答案:

答案 0 :(得分:5)

这样的事可能吗?

mask = np.zeros(X.shape, dtype='bool')
mask[ix] = True

但如果它像X > 0一样简单,那么除非mask = X > 0非常稀疏或您不再引用mask,否则最好不要执行X

答案 1 :(得分:2)

mask = X > 0
imask = np.logical_not(mask)

例如

编辑:很抱歉之前这么简洁。不应该通过电话回答问题:P

正如我在示例中所提到的,最好只是反转布尔掩码。比从where的结果返回更有效/更容易。

答案 2 :(得分:1)

>>> G = np.zeros(X.shape,dtype=np.bool)
>>> G[ix] = True

是击败的默认答案(在优雅,效率方面)。

答案 3 :(得分:1)

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的解决方案慢很多。)