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

nzrxty8p  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个大小为(3000,3000)的稀疏矩阵A,我有另一个大小为(83068,2)的矩阵B,它包含A的非零元素的索引。
有没有可能得到一个结果二维矩阵C,使得它只包括来自A的非零元素?
这是我迄今为止所尝试的:

A[B]

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

6kkfgxo0

6kkfgxo01#

如这里所解释的,* 如果向索引提供元组,则元组将被解释为索引的列表 *。
这就是为什么 * 可以直接使用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]])


因此,您需要将其重新格式化为一个元组,其元素数量与A数组中的维度数量相同,正如@hpaulj所指出的那样。举例来说:

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

相关问题