python - numpy.square 返回稀疏矩阵的错误结果

标签 python numpy scipy

当将 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/

相关文章:

python - 为什么 Matlab interp1 产生的结果与 numpy interp 不同?

python - 类型错误 : 'int' object is not callable in np. 随机种子

python - 将稀疏 scipy 矩阵加载到现有的 numpy 稠密矩阵中

python - 创建一堆表时出现神秘的 "errno 150"Mysql.connector python

python - Keras:平均不同的损失函数

python - 对于这种情况,Python 和 Hadoop 的选择是否合适?

python - python执行模型查询

python - 在 NumPy 中计算距离矩阵的有效方法

python - 有效地累积稀疏 scipy 矩阵的集合

python - 使用 CURVE_FIT 在 Python 中拟合对数正态分布