【问题标题】:reverse numpy reference cartesian product反向 numpy 参考笛卡尔积
【发布时间】:2017-12-01 06:06:01
【问题描述】:

我正在使用一个函数来获取 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]),)

【问题讨论】:

    标签: python arrays pandas numpy cartesian-product


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,但我不确定如何实施。我尝试使用 398,但我认为我没有正确地做某事。你能提供一个使用数字的例子吗?第一个解决方案是最好的,因为它会运行很多次,如果可能的话我想节省空间。
    • 谢谢 Dan,我在这方面做了更多的工作,第二个解决方案效果很好,因为它只需要运行几次,如果条件为真。第一部分需要运行多次,而这部分只有几次。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2013-12-25
    • 2013-07-14
    相关资源
    最近更新 更多