我有两个Numpy数组x
,它们的形状(m, i)
和y
形状都相同(m, j)
(所以行数是相同的)。我想将element的x
每一列乘以y
element-wise的每一列,以使结果为shape (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]])
目前,我已经实现此操作超过的列中的两个嵌套循环x
和y
:
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[:,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]
,broadcasting
对于y
和都将存在x
,从而导致输出数组的形状为(10,3,2)
。为了获得shape的最终输出数组(10,6)
,我们只需要将最后两个轴与该整形合并即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句