Python 将二维数组中的每列与另一个二维数组中的每列相乘

Python 将二维数组中的每列与另一个二维数组中的每列相乘,python,numpy,vectorization,Python,Numpy,Vectorization,我有两个Numpy数组x和y(行数相同)。我想将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

我有两个Numpy数组
x
y
(行数相同)。我想将
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]])
def _mult(x, y):
    r = []
    for xc in x.T:
        for yc in y.T:
            r.append(xc * yc)
    return np.array(r).T
现在的结果应该是:

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]])
目前,我已经在
x
y
列上使用两个嵌套循环实现了此操作:

array([[0, 0],
       [1, 1],
       [1, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 1],
       [1, 1],
       [0, 1],
       [1, 0]])
def _mult(x, y):
    r = []
    for xc in x.T:
        for yc in y.T:
            r.append(xc * yc)
    return np.array(r).T
然而,我非常确定,一定有一个更优雅的解决方案,我似乎想不出来。

使用-

解释

作为投入,我们有-

y : 10 x 2
x : 10 x 3
y : 10 x 1 x 2
x : 10 x 3 x 1
使用
y[:,None]
,我们将在现有两个DIM之间引入一个新轴,从而创建一个
3D
阵列版本。这将保持第一个轴作为
3D
版本中的第一个轴,并将第二个轴作为第三个轴推出

使用
x[…,None]
,我们将引入一个新轴作为最后一个轴,方法是将两个现有DIM向上推作为前两个DIM,以生成
3D
阵列版本

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

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

使用
y[:,None]*x[…,None]
,将对
y
x
进行
广播
,从而产生形状为
(10,3,2)
的输出数组。要获得形状的最终输出数组
(10,6)
,我们只需要将最后两个轴与该形状合并。

“复杂”的hack,但非常简洁+1您能在这里添加一些解释吗?它很简洁,但不是解释性的。@kmario23添加了一些解释,请查看!