让我们从简单的例子开始:我有三列A,B,C的数组。我想在数组中添加其他列:
A / B
一个/ C
B / C
通过简单的逐元素划分从旧的列生成这些新列,包括除对称(例如B / A)之外的所有可能组合。对于少量的初始列,手动操作很容易,但如果我有20个起始列,那么20 *(20-1)/ 2 = 190个新列......
如何以聪明的方式做到这一点?
第二部分是如何使用用户定义的函数而不是分割例如A + B-A * B
您可以提供任何帮助都很棒。
答案 0 :(得分:0)
对于除法问题,我们可以使用np.triu_indices
生成这些列号的成对组合的通用解决方案,如此 -
from __future__ import division
r,c = np.triu_indices(arr.shape[1],1) # pairwise column IDs
out = arr[:,r]/arr[:,c]
示例运行
1)3列(验证输出值):
In [74]: arr = np.random.randint(11,99,(5,3)) #Sample input array with 3 cols
In [75]: r,c = np.triu_indices(arr.shape[1],1)
In [76]: arr[:,r]/arr[:,c]
Out[76]:
array([[ 1.85714286, 0.4875 , 0.2625 ],
[ 0.94565217, 0.92553191, 0.9787234 ],
[ 0.45652174, 0.24137931, 0.52873563],
[ 0.84931507, 0.69662921, 0.82022472],
[ 0.23170732, 0.52777778, 2.27777778]])
In [77]: arr[:,0]/arr[:,1]
Out[77]: array([ 1.85714286, 0.94565217, 0.45652174, 0.84931507, 0.23170732])
In [78]: arr[:,0]/arr[:,2]
Out[78]: array([ 0.4875 , 0.92553191, 0.24137931, 0.69662921, 0.52777778])
In [79]: arr[:,1]/arr[:,2]
Out[79]: array([ 0.2625 , 0.9787234 , 0.52873563, 0.82022472, 2.27777778])
2)20列(验证输出):
In [71]: arr = np.random.randint(11,99,(5,20)) #Sample input array with 20 cols
In [72]: r,c = np.triu_indices(arr.shape[1],1)
In [73]: (arr[:,r]/arr[:,c]).shape # Verify output array shape
Out[73]: (5, 190)