python - 沿任意轴的 numpy 广播加法

标签 python numpy

我想通过简单地沿一个或多个轴执行相同的加法来添加两个不同维度的数组。

非矢量化解决方案:

x = np.array([[[1,2],[3,4],[5,6]],[[7,8],[9,0],[1,2]],[[3,4],[5,6],[7,8]],[[9,0],[1,2],[3,4]]]) #shape (4,3,2)
y = np.array([[1,2],[3,4],[5,6],[7,8]]) #shape (4,2)

ans = np.copy(x)
for i in range(x.shape[1]):
    ans[:,i] += y

print(ans) #shape (4,3,2)

我怎样才能沿着(例如)第二轴传播这个?更一般地说,我怎样才能沿着任意轴进行广播?

最佳答案

看两个数组的形状:

>>> x.shape
(4, 3, 2)
>>> y.shape
(4, 2)

您会看到添加需要沿此处的第 0 个和最后一个轴广播。一个简单的选择是

>>> x + y[:, None, :] 
array([[[ 2,  4],
        [ 4,  6],
        [ 6,  8]],

       [[10, 12],
        [12,  4],
        [ 4,  6]],

       [[ 8, 10],
        [10, 12],
        [12, 14]],

       [[16,  8],
        [ 8, 10],
        [10, 12]]])

在哪里,

>>> y[:, None, :].shape
(4, 1, 2)

这实际上只是改变了 y 的步幅,因此可以广播添加。


更好的是,按照 hpaulj 在评论中的建议使用 np.expand_dims,这将添加一个额外的倒数第二个维度,因此您可以这样做

>>> x + np.expand_dims(y, 1)
array([[[ 2,  4],
        [ 4,  6],
        [ 6,  8]],

       [[10, 12],
        [12,  4],
        [ 4,  6]],

       [[ 8, 10],
        [10, 12],
        [12, 14]],

       [[16,  8],
        [ 8, 10],
        [10, 12]]])

关于python - 沿任意轴的 numpy 广播加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216866/

相关文章:

python - 正弦波鸣叫

python - 从生成器创建两个串联数组

python - 代码在不需要时自动实现变量

python - 将一组 NumPy 数组传递给 C 函数以进行输入和输出

python - 将 pandas dataframe json 列切成列

python - 在 Python 中,为什么整数元组比不同的整数占用更少的空间?

python - 如何找到节点的马尔可夫毯?

Python 脚本通过 ssh 连接、运行进程并断开连接,无需等待

python - 如何为在 Python 中更新的条形图制作动画

python - 如何计算 PIL 逊相关矩阵并仅保留有效值?