如何使用另一个包含索引的 2D numpy 数组对 2D numpy 数组进行切片?

How do I slice a 2D numpy array using another 2D numpy array that contains indices?

提问人:itsanhtuanho 提问时间:7/29/2023 最后编辑:itsanhtuanho 更新时间:7/29/2023 访问量:34

问:

我有一个大小为 (3000,3000) 的稀疏矩阵 A,我还有另一个大小为 (83068, 2) 的矩阵 B,其中包含 A 的非零元素的索引。

是否有可能得到一个生成的二维矩阵 C,使其仅包含来自 A 的非零元素?

这是我到目前为止尝试过的:

A[B]

但结果大小为 (83068, 2, 3000)

python 数组 numpy 索引 切片

评论

2赞 hpaulj 7/29/2023
A[B[:,0], B[:,1] ]
0赞 hpaulj 7/29/2023
I, J = B.T; X=A[I,J]

答:

2赞 aerobiomat 7/29/2023 #1

本文所述,如果向索引提供元组,则该元组将被解释为索引列表

这就是为什么可以直接使用 np.nonzero() 函数的输出作为索引的原因,因为它总是返回索引数组的元组

因此,您可以使用:

>>> A = np.array([[0, 9, 3], [8, 0, 0], [6, 7, 5]])
>>> A[np.nonzero(A)]
array([9, 3, 8, 6, 7, 5])

您可以检查是否返回一个元组:np.nonzero()

>>> np.nonzero(A)
(array([0, 0, 1, 2, 2, 2]), array([1, 2, 0, 0, 1, 2]))

但是您的数组具有不同的格式,如下所示:B

>>> B = np.array(np.nonzero(A)).T
>>> B
array([[0, 1],
       [0, 2],
       [1, 0],
       [2, 0],
       [2, 1],
       [2, 2]])

因此,您需要将其重新格式化为元组,其中包含与数组中维度一样多的元素,正如 @hpaulj 所指出的那样。例如:A

>>> tuple(B.T)
(array([0, 0, 1, 2, 2, 2]), array([1, 2, 0, 0, 1, 2]))

综上所述:

>>> A[tuple(B.T)]
array([9, 3, 8, 6, 7, 5])

评论

1赞 hpaulj 7/29/2023
事实上,产生 (n,2) 数组的就像是 。np.argwhereBnp.transpose(np.nonzero(...))