为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

冉冉说 2021-03-29 19:11:27
我正在尝试使用最初在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 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您还可以编写:


>>> X[np.ix_(idx,idx)]

array([[ 1,  4],

       [13, 16]])


查看完整回答
反对 回复 2021-04-06
?
动漫人物

TA贡献1815条经验 获得超10个赞

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]])


查看完整回答
反对 回复 2021-04-06
?
达令说

TA贡献1821条经验 获得超6个赞

在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的工作方式相同。


查看完整回答
反对 回复 2021-04-06
  • 3 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号