我正在尝试使用最初在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])
通过逻辑索引从矩阵中获取网格的正确方法是什么?
答案 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=True
和False*True=False
,np.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
一样。