反向 numpy 参考笛卡尔积

reverse numpy reference cartesian product

我正在使用一个函数来获取 3 组数组 (cp1) 的笛卡尔积,这些数组派生自 pandas 数据帧中的列。获得这个 (cp2) 后,我 运行 进行测试以检查总和是否小于 1.05,如果是,我想从原始数组中找到从它为真的位置生成它的组合。有没有办法用 numpy / python / pandas 来做到这一点?任何帮助,将不胜感激。最终,我想获得生成真实条件的数据框中每一列的原始索引。

In [780]: cp1.shape

Out[780]: (8, 3)

In [781]: cp2.shape

Out[781]: (512, 3)

In [782]: cp2

Out[782]: array([[ 0.43478262,  0.33333334,  0.29411763],
                 [ 0.43478262,  0.33333334,  0.32258067],
                 [ 0.43478262,  0.33333334,  0.32786885],
                   ..., 
                 [ 0.43478262,  0.32258067,  0.32258067],
                 [ 0.43478262,  0.32258067,  0.29850748],
                 [ 0.43478262,  0.32258067,  0.32258067]])

In [783]: bools = cp2.sum(1) < 1.05

In [784]: np.where(bools)

Out[784]: (array([392, 398, 440, 446]),)

您可以在 ai * c + bi == idx 中求解 aibi,其中 r < len(a)c == len(b) 通过 ai, bi = divmod(idx, len(b))。这是指数计算的逆运算。

另一个更直接但使用更多的选项 space 是取 numpy.arange(len(a))numpy.arange(len(b)) 的笛卡尔积,然后用您的索引对其进行索引以获得索引原始数组。