python 矩阵切片_python – Numpy,如何使用布尔切片获得子矩阵

您遇到的问题归结为矩阵返回的操作始终返回二维数组.

在第一个数组上构建掩码时,您会得到:

In [24]: a2[:,1] > 10

Out[24]: array([False, False, True, True, True], dtype=bool)

正如您所看到的,它是一维数组.

当你用矩阵做同样的事情时,你会得到:

In [25]: m2[:,1] > 10

Out[25]:

matrix([[False],

[False],

[ True],

[ True],

[ True]], dtype=bool)

换句话说,您有一个nx1数组,而不是长度为n的数组.

numpy中的索引操作会有所不同,具体取决于您是使用一维还是n维数组进行索引.

在第一种情况下,numpy会将长度为n的数组视为行索引,因此您将获得预期的结果:

In [28]: a2[a2[:,1] > 10]

Out[28]:

array([[12, 13, 14, 15, 16, 17],

[18, 19, 20, 21, 22, 23],

[24, 25, 26, 27, 28, 29]])

在第二种情况下,因为你有一个二维索引数组,numpy有足够的信息来提取行和列,所以它只从匹配列(第一个)中抓取东西:

In [29]: m2[m2[:,1] > 10]

Out[29]: matrix([[12, 18, 24]])

要回答你的问题:你可以通过将掩码转换为数组并抓住第一列来获取此行为,以提取长度为n的初始数组:

In [32]: m2[np.array(m2[:,1] > 10)[:,0]]

Out[32]:

matrix([[12, 13, 14, 15, 16, 17],

[18, 19, 20, 21, 22, 23],

[24, 25, 26, 27, 28, 29]])

或者,您可以先进行转换,得到与以前相同的结果:

In [34]: np.array(m2)[:,1] > 10

Out[34]: array([False, False, True, True, True], dtype=bool)

现在,这两个修复都需要在矩阵和数组之间进行转换,这可能非常难看.

我要问自己的问题是为什么你希望使用矩阵,但期望数组的行为.可能是你工作的正确工具实际上是一个数组,而不是一个矩阵.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值