6

我正在尝试使用最初在 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])

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

4

3 回答 3

7

你也可以写:

>>> X[np.ix_(idx,idx)]
array([[ 1,  4],
       [13, 16]])
于 2013-06-27T07:10:22.137 回答
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]])
于 2013-06-27T07:04:36.353 回答
2

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

您可以使用 anouter从您的 1D 中idx创建适当2D的索引数组。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在执行切片后包含 a 一样工作。

于 2013-06-27T06:39:16.860 回答