gpt4 book ai didi

python - Numpy,如何使用 bool 切片获取子矩阵

转载 作者:太空狗 更新时间:2023-10-30 01:08:04 26 4
gpt4 key购买 nike

我有一个问题:如何通过 bool 切片得到一个像子数组这样的子矩阵?

例如:

    a2 = np.array(np.arange(30).reshape(5, 6))
a2[a2[:, 1] > 10]

会给我:

    array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])

但是:

    m2 = np.mat(np.arange(30).reshape(5, 6))
m2[m2[:, 1] > 10]

会给我:

    matrix([[12, 18, 24]])

为什么输出不同,如何从矩阵中得到与数组相同的结果?

谢谢!

最佳答案

您遇到的问题归结为对矩阵返回的操作总是返回二维数组。

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

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)

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

我要问自己的问题是,为什么您希望使用矩阵,但又期望数组的行为。可能适合您工作的工具实际上是数组,而不是矩阵。

关于python - Numpy,如何使用 bool 切片获取子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com