我有一个大小为(3000,3000)的稀疏矩阵A,我有另一个大小为(83068,2)的矩阵B,它包含A的非零元素的索引。有没有可能得到一个结果二维矩阵C,使得它只包括来自A的非零元素?这是我迄今为止所尝试的:
A[B]
字符串但结果大小为(83068,2,3000)
6kkfgxo01#
如这里所解释的,* 如果向索引提供元组,则元组将被解释为索引的列表 *。这就是为什么 * 可以直接使用np.nonzero()函数的输出作为索引,因为它总是返回索引数组的元组 *。因此,您可以用途:
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
>>> B = np.array(np.nonzero(A)).T >>> B array([[0, 1], [0, 2], [1, 0], [2, 0], [2, 1], [2, 2]])
型因此,您需要将其重新格式化为一个元组,其元素数量与A数组中的维度数量相同,正如@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条答案
按热度按时间6kkfgxo01#
如这里所解释的,* 如果向索引提供元组,则元组将被解释为索引的列表 *。
这就是为什么 * 可以直接使用
np.nonzero()
函数的输出作为索引,因为它总是返回索引数组的元组 *。因此,您可以用途:
字符串
你可以检查
np.nonzero()
是否返回一个元组:型
但是你的
B
数组有一个不同的格式,像这样:型
因此,您需要将其重新格式化为一个元组,其元素数量与
A
数组中的维度数量相同,正如@hpaulj所指出的那样。举例来说:型
总的来说:
型