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

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

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


冉冉说
浏览 192回答 3
3回答

蛊毒传说

您还可以编写:>>> X[np.ix_(idx,idx)]array([[ 1,  4],       [13, 16]])

动漫人物

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 integersIn [3]: X[idx][:,idx]Out[3]: array([[ 1,  4],       [13, 16]])

达令说

在numpy此称为fancy indexing。要获得您想要的项目,您应该使用2D索引数组。您可以使用outer来从1D中idx创建适当2D的索引数组。当应用于两个序列时,外部函数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完成切片后添加a的工作方式相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python