在 NumPy 中向量化成对列元素乘积
Vectorizing Pairwise Column Element-wise Product in NumPy
我有两个数据框:
>>> 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
两个 DataFrame 的行数相同(例如 m),但列数不同(例如 ncol_1、ncol_2)。输出是一个 m by (ncol_1 * ncol_2) DataFrame。每列都是 d1 中的一列和 d2 中的一列的乘积。
我遇到过 np.kron
,但它并不完全符合我的要求。我的实际数据有数百万行。
我想知道是否有任何向量化的方法可以做到这一点?我目前有一个 itertools.product
实现,但速度非常慢。
IIUC,使用for循环并不总是坏的,
pd.DataFrame({x+y: df1[x]*df2[y] for x in df1 for y in df2})
Out[81]:
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
一个 NumPy-broadcasting
-
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]
对于大数据,利用 multi-cores
和 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)
我有两个数据框:
>>> 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
两个 DataFrame 的行数相同(例如 m),但列数不同(例如 ncol_1、ncol_2)。输出是一个 m by (ncol_1 * ncol_2) DataFrame。每列都是 d1 中的一列和 d2 中的一列的乘积。
我遇到过 np.kron
,但它并不完全符合我的要求。我的实际数据有数百万行。
我想知道是否有任何向量化的方法可以做到这一点?我目前有一个 itertools.product
实现,但速度非常慢。
IIUC,使用for循环并不总是坏的,
pd.DataFrame({x+y: df1[x]*df2[y] for x in df1 for y in df2})
Out[81]:
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
一个 NumPy-broadcasting
-
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]
对于大数据,利用 multi-cores
和 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)