计算 numpy 数组中的列组合

Calcuations on column combinations in a numpy array

假设我有以下 numpy 数组 / pandas df:

| 0  | 1  | 2  | 3  | 4  | 5  | 6  |
| -- | -- | -- | -- | -- | -- | -- |
| 39 | 27 | 36 | 30 | 32 | 29 | 40 |
| 36 | 26 | 32 | 37 | 30 | 40 | 28 |
| 32 | 40 | 35 | 30 | 28 | 39 | 31 |
| 27 | 34 | 28 | 28 | 31 | 35 | 40 |
| 36 | 29 | 26 | 26 | 25 | 39 | 33 |
| 39 | 30 | 26 | 29 | 38 | 40 | 37 |
| 31 | 28 | 30 | 37 | 29 | 38 | 32 |
| 26 | 39 | 34 | 40 | 35 | 25 | 36 |
| 35 | 38 | 31 | 38 | 40 | 28 | 39 |
| 25 | 35 | 40 | 27 | 27 | 30 | 27 |
| 32 | 30 | 31 | 35 | 38 | 25 | 32 |
| 30 | 38 | 35 | 36 | 30 | 37 | 34 |
| 33 | 31 | 36 | 32 | 30 | 25 | 25 |
| 36 | 31 | 30 | 38 | 39 | 30 | 38 |
| 25 | 29 | 31 | 30 | 27 | 36 | 38 |

我想在每个列对上 运行 f(coli,colj) 所以 f(0,1), f(0,2), f(0,6), ..., f(6,6) 并获得一个 6x6 数组。我能够使用嵌套循环快速实现这一点,这没问题。我遇到 运行 的问题是我还需要将 f(coli,colj) 的结果与其自身进行比较,因此 g(f(i,j), f(k,m)) 会生成一个 6x6x6x6 数组。一个 4D 嵌套循环大约需要一分钟 运行 .

for i in array.T:
    for j in array.T:
        for k in array.T:
            for m in array.T:
                output[i][j][k][l] = g(f(i, j), f(k, m))

有没有更快的广播方式?

换句话说,您将如何通过从列中选择所有可能的对来创建一个二维数组来执行某个功能,然后从该数组中再次选择所有对并重复相同的过程。希望有意义

To rephrase the question, how would you perform a certain function by choosing all possible pairs from the column to create a 2D array..

假设您有一个数据框 df,形状为 (n, m),即:

n, m = df.shape

使用np.mgrid创建所有列对的索引(i, j):

i, j = np.mgrid[:m, :m].reshape((2, -1))

(i 和 j 现在的形状都是 (m**2,)

..然后分别使用 i 和 j 为每个 arg 到 f 索引您的数据框:

f_res = f(df.iloc[:, i], df.iloc[:, j])

(f_res 现在的形状是 (n, m**2))

现在您可以重复相同的操作,但是在“f_res”上将参数设置为 g:

i, j = np.mgrid[:m**2, :m**2].reshape((2, -1))

(i 和 j 现在的形状都是 (m**4,)

g_res = g(f_res.iloc[:, i], f_res.iloc[:, j])

(g_res 现在的形状是 (n, m**4))

如果你想要 f(.., ..) 形状 (n, m, m) 的结果,那么做:

f_res_grid = f_res.values.reshape((-1, m, m))

如果你想要 g(.., ..) 形状的结果 (n, m, m, m, m) 然后做同样的事情:

g_res_grid = g_res.values.reshape((n, m, m, m, m))

我希望你明白了..