【问题标题】:Multiply each column from 2D array with each column from another 2D array将二维数组中的每一列与另一个二维数组中的每一列相乘
【发布时间】:2016-12-07 12:06:12
【问题描述】:

我有两个形状为(m, i) 的Numpy 数组x 和形状为y(m, j)(因此行数相同)。我想将x 的每一列与y 的每一列元素相乘,这样结果的形状为(m, i*j)

例子:

import numpy as np

np.random.seed(1)
x = np.random.randint(0, 2, (10, 3))
y = np.random.randint(0, 2, (10, 2))

这将创建以下两个数组x

array([[1, 1, 0],
       [0, 1, 1],
       [1, 1, 1],
       [0, 0, 1],
       [0, 1, 1],
       [0, 0, 1],
       [0, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [0, 1, 0]])

y:

array([[0, 0],
       [1, 1],
       [1, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 1],
       [1, 1],
       [0, 1],
       [1, 0]])

现在结果应该是:

array([[0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0]])

目前,我在xy 的列上使用两个嵌套循环实现了这个操作:

def _mult(x, y):
    r = []
    for xc in x.T:
        for yc in y.T:
            r.append(xc * yc)
    return np.array(r).T

但是,我很确定一定有一个我想不出的更优雅的解决方案。

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:

    使用NumPy broadcasting -

    (y[:,None]*x[...,None]).reshape(x.shape[0],-1)
    

    说明

    作为输入,我们有 -

    y : 10 x 2
    x : 10 x 3
    

    通过y[:,None],我们在现有的两个维度之间引入了一个新轴,从而创建了一个3D 数组版本。这会在3D 版本中将第一个轴保持为第一个轴,并将第二个轴作为第三个轴推出。

    对于x[...,None],我们将引入一个新轴作为最后一个轴,方法是将两个现有的暗角推高作为前两个暗角,从而产生3D 数组版本。

    总而言之,随着新轴的引入,我们有 -

    y : 10 x 1 x 2
    x : 10 x 3 x 1
    

    对于y[:,None]*x[...,None]yx 都会有broadcasting,从而产生一个形状为(10,3,2) 的输出数组。要获得形状 (10,6) 的最终输出数组,我们只需要将最后两个轴与该重塑合并。

    【讨论】:

    • "complicated" hack 但非常简洁! +1
    • 你能在这里添加一些解释吗?它简洁但不解释。
    • @kmario23 添加了一些解释,看看吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2019-12-08
    • 2019-03-22
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多