Python NumPy中矢量化成对列元素级积

Python NumPy中矢量化成对列元素级积,python,pandas,numpy,linear-algebra,array-broadcasting,Python,Pandas,Numpy,Linear Algebra,Array Broadcasting,我有两个数据帧: >>> d1 A B 0 4 3 1 5 2 2 4 3 >>> d2 C D E 0 1 4 7 1 2 5 8 2 3 6 9 >>> what_I_want AC AD AE BC BD BE 0 4 16 28 3 12 21 1 10 25 40 4 10 16 2 12 24 36

我有两个数据帧:

>>> d1

    A  B
0   4  3
1   5  2
2   4  3

>>> d2

    C  D  E
0   1  4  7
1   2  5  8
2   3  6  9

>>> what_I_want

    AC  AD  AE  BC  BD  BE
0   4   16  28  3   12  21
1   10  25  40  4   10  16
2   12  24  36  9   18  27

两个数据帧的行数相同(比如m),但列数不同(比如ncol_1,ncol_2)。输出是一个m乘(ncol_1*ncol_2)数据帧。每列是d1中一列和d2中一列的乘积

我遇到过np.kron,但它并不能完全满足我的需要。我的实际数据有数百万行


我想知道是否有任何矢量化的方法可以做到这一点?我目前有一个
itertools.product
实现,但是速度非常慢。

IIUC,使用for循环并不总是很糟糕

一个-

对于大数据,使用
numexpr
-

import numexpr as ne

out = ne.evaluate('a3D*b3D',{'a3D':a[:,:,None],'b3D':b[:,None]}).reshape(len(a),-1)
df_out = pd.DataFrame(out)

谢谢你的回答!它就像一个符咒。但我有一个问题:在NumPy版本中,您使用的是
b[:,无,:]
,但在numexpr中,您使用的是
b[:,无]
?@KemengZhang-Nah,这是一样的。在numexpr版本中,我试图使其紧凑,以使其保持在答案帖子允许的宽度内。
a = d1.to_numpy(copy=False) # d1.values on older pandas versions
b = d2.to_numpy(copy=False)
df_out = pd.DataFrame((a[:,:,None]*b[:,None,:]).reshape(len(a),-1))
df_out.columns = [i+j for i in d1.columns for j in d2.columns]
import numexpr as ne

out = ne.evaluate('a3D*b3D',{'a3D':a[:,:,None],'b3D':b[:,None]}).reshape(len(a),-1)
df_out = pd.DataFrame(out)