方法#1
使用np.triu_indices的一个解决方案是 –
r,c = np.triu_indices(arr.shape[1])
out = np.concatenate((arr,arr[:,r]*arr[:,c]),axis=1)
方法#2
更快切割 –
def pairwise_col_mult(a):
n = a.shape[1]
N = n*(n+1)//2
idx = n + np.concatenate(( [0], np.arange(n,0,-1).cumsum() ))
start, stop = idx[:-1], idx[1:]
out = np.empty((a.shape[0],n+N),dtype=a.dtype)
out[:,:n] = a
for j,i in enumerate(range(n)):
out[:,start[j]:stop[j]] = a[:,[i]] * a[:,i:]
return out
计时 –
In [254]: arr = np.random.randint(0,9,(10000,100))
In [255]: %%timeit
...: r,c = np.triu_indices(arr.shape[1])
...: out = np.concatenate((arr,arr[:,r]*arr[:,c]),axis=1)
1 loop, best of 3: 577 ms per loop
In [256]: %timeit pairwise_col_mult(arr)
1 loop, best of 3: 233 ms per loop