通过Numpy中的逻辑索引获取矩阵的网格

时间:2013-06-27 06:28:11

标签: python matlab numpy matrix-indexing

我正在尝试使用最初在MATLAB中的numpy重写函数。在MATLAB中有一个逻辑索引部分如下:

X = reshape(1:16, 4, 4).';
idx = [true, false, false, true];
X(idx, idx)

ans =

     1     4
    13    16

当我尝试将其设置为numpy时,我无法获得正确的索引:

X = np.arange(1, 17).reshape(4, 4)
idx = [True, False, False, True] 
X[idx, idx]
# Output: array([6, 1, 1, 6])

通过逻辑索引从矩阵中获取网格的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

你也可以写:

>>> X[np.ix_(idx,idx)]
array([[ 1,  4],
       [13, 16]])

答案 1 :(得分:4)

In [1]: X = np.arange(1, 17).reshape(4, 4)

In [2]: idx = np.array([True, False, False, True])  # note that here idx has to
                                                    # be an array (not a list)
                                                    # or boolean values will be 
                                                    # interpreted as integers

In [3]: X[idx][:,idx]
Out[3]: 
array([[ 1,  4],
       [13, 16]])

答案 2 :(得分:2)

numpy中,这称为fancy indexing。要获得所需的项目,您应该使用2D索引数组。

您可以使用outer从您的1D idx制作正确的2D索引数组。 The outers,当应用于两个1D序列时,将一个序列的每个元素与另一个序列的每个元素进行比较。回顾True*True=TrueFalse*True=Falsenp.multiply.outer()np.outer()相同,可以为您提供2D个索引:

idx_2D = np.outer(idx,idx)
#array([[ True, False, False,  True],
#       [False, False, False, False],
#       [False, False, False, False],
#       [ True, False, False,  True]], dtype=bool)

您可以使用:

x[ idx_2D ]
array([ 1,  4, 13, 16])

在您的真实代码中,您可以使用x=[np.outer(idx,idx)],但它不会节省内存,就像您在执行切片后包含del idx_2D一样。