gpt4 book ai didi

python - numpy 是否提供广义内积?

转载 作者:太空狗 更新时间:2023-10-29 20:57:57 30 4
gpt4 key购买 nike

大多数面向数组的语言(例如 APL 或 J)都具有某种形式的广义内积,其作用类似于标准矩阵乘法,但支持任意运算以代替标准运算。例如,在 J +/ . *是标准的先乘后和,但你也可以做,例如<./ . +获得先加后最小操作(比如增量更新通过图形的最短路径的长度)。

在缓慢且仅支持 2D 的 Python 中,这类似于:

import numpy as np

def general_inner(f, g, x, y):
return np.array([[f(g(x1, y1)) for y1 in y.T] for x1 in x])

x = np.arange(1, 5, dtype="float").reshape((2, 2))
y = np.array([[0.9], [0.1]])
assert(x.dot(y) == general_inner(np.sum, np.multiply, x, y))

是否 numpy提供任何直接支持这种模式的东西吗?

最佳答案

你可以通过切片来实现。我们可以 reshape 这两个参数,以便操作将被广播而不是按元素执行,然后沿着不需要的轴执行减少操作。

import numpy

a = numpy.array([[1, 2, 3],
[4, 5, 6]])
b = numpy.array([[7, 8],
[9, 10],
[11, 12]])

# Ordinary matrix multiplication
print(a @ b)
# Matrix multiplication using broadcasting
print(numpy.sum(a[:,:,numpy.newaxis] * b[numpy.newaxis,:,:], axis=1))
# Our "generalized" version
print(numpy.min(a[:,:,numpy.newaxis] + b[numpy.newaxis,:,:], axis=1))

我不愿将其称为“广义内积”,因为内积具有新版本所缺乏的特定数学结构。

它的基本工作方式是任何 numpy.newaxis 的长度为 1 并被广播,所以:

a[:,:,numpy.newaxis] * b[numpy.newaxis,:,:]

给我们:

result[i,j,k] = a[i,j] * b[j,k]

或者如果它能帮助你理解(我发现广播有时有点困惑),

aa = a[:,:,numpy.newaxis]
bb = b[numpy.newaxis,:,:]
result[i,j,k] = aa[i,j,0] * bb[0,j,k]

关于python - numpy 是否提供广义内积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42170477/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com