如何添加从其他列生成的多个列 - numpy

时间:2016-12-25 19:12:53

标签: python numpy

让我们从简单的例子开始:我有三列A,B,C的数组。我想在数组中添加其他列:

  • A / B

  • 一个/ C

  • B / C

通过简单的逐元素划分从旧的列生成这些新列,包括除对称(例如B / A)之外的所有可能组合。对于少量的初始列,手动操作很容易,但如果我有20个起始列,那么20 *(20-1)/ 2 = 190个新列......

如何以聪明的方式做到这一点?

第二部分是如何使用用户定义的函数而不是分割例如A + B-A * B

您可以提供任何帮助都很棒。

1 个答案:

答案 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)