当将 scipy.sparse 矩阵传递给它时,
numpy.square
似乎给出了不正确的输出:
import numpy as np
import scipy.sparse as S
a = np.array([np.arange(5), np.arange(5), np.arange(5), np.arange(5), np.arange(5)])
a
# array([[0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4]])
np.square(a)
# array([[ 0, 1, 4, 9, 16],
# [ 0, 1, 4, 9, 16],
# [ 0, 1, 4, 9, 16],
# [ 0, 1, 4, 9, 16],
# [ 0, 1, 4, 9, 16]])
b = S.lil_matrix(a)
c = np.square(b)
c
# <5x5 sparse matrix of type '<class 'numpy.int64'>'
# with 20 stored elements in Compressed Sparse Row format>
c[2,2]
# 20
# Expected output is 4, as in np.square(a) output above.
这是一个错误吗?
最佳答案
一般来说,将 scipy.sparse
矩阵传递到以数组(“array_like”)作为输入的 numpy
函数中,会导致未定义/意外的行为。
没有自动稀疏 -> 密集
转换。
Numpy 对 Scipy 的稀疏矩阵一无所知。
稀疏矩阵不是 Numpy 理解的意义上的“类似数组”。 然后 numpy 函数所做的就是将稀疏矩阵视为一些未知类型的 Python 对象——通常会将它们放入 1 元素对象数组中,并从那里开始工作。为了返回标量结果,临时对象数组将被丢弃,只返回其中包含的对象,因此很容易错过实际上做了一些奇怪的事情。
对象数组在对其元素(未知的 Python 对象)执行算术等操作时有一些后备措施,包括在需要执行 *
时调用元素的 operator.mul
等等。然后将其与上述结果结合起来,形成您所看到的行为。
关于python - numpy.square 返回稀疏矩阵的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958913/