python - 2D 稀疏矩阵乘以 3D 数组

标签 python python-3.x numpy

有什么方法可以将 2D 稀疏矩阵乘以 3D numpy 数组吗? 例如我有这个功能

def myFun(x, p):
    r = 2
    out = x * np.log(p) + r * np.log(1-p)
    return out

其中 x 是维度 3500, 90 的数组,p 是维度 3500, 90, 70 的另一个数组。目前,xp 都是密集数组,我只是在调用该函数时进行广播:

out = myFun(x[..., None], p)

但是数组 x 非常稀疏,只有 7% 的元素非零。另一方面,p 没有任何零,仅在零和一之间 float 。 我希望通过稀疏矩阵(可能来自 scipy.sparse )我会看到速度的提高。但是,我不知道如何执行此操作,或者这是否更有效。

我使用的是 python 3。

非常感谢

最佳答案

您可以使用 where 关键字来利用 x 的稀疏性。

def sprse(x, p):
    r = 2
    out = x * np.log(p, where=x.astype(bool)) + r * np.log(1-p)
    return out

from timeit import timeit
x = np.random.uniform(-13, 1, (3500, 90, 1)).clip(0, None)
p = np.random.random((3500, 90, 70))
assert np.all(sprse(x, p)==myFun(x, p))
def f():
    return myFun(x, p)
print(timeit(f, number=3))
def f():
    return sprse(x, p)
print(timeit(f, number=3))

示例运行:

5.171174691990018
3.2122434769989923

关于python - 2D 稀疏矩阵乘以 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53671058/

相关文章:

python - 具有广播功能的 numpy 数组构造

python - 如何将数组中的零转换为Nan?

python - 多处理写入python数组的函数循环

python - PySide:带有样式表的圆角不起作用

python - 每次运行python代码时都必须导入excel文件吗?

python - 打印曲线拟合功能

python - 使用半正矢距离公式从经度和纬度获取距离

python - 如何在 PyQt 中嵌入 vispy 图形?

regex - Python v3 不一致的正则表达式匹配返回

python - 使用 Python 对数据框进行分组