【发布时间】:2021-11-26 09:39:38
【问题描述】:
question 给出了两个矩阵的答案,但我不确定如何将此逻辑应用于三个成对连接的矩阵,因为没有“免费”索引。我想最大化以下功能:
f(i, j, k) = min(A(i, j), B(j, k), C(i,k))
其中A、B 和C 是矩阵,i、j 和k 是范围高达矩阵各自维度的索引。我想找到(i, j, k) 使得f(i, j, k) 最大化。我目前这样做如下:
import numpy as np
import itertools
I = 100
J = 150
K = 200
A = np.random.rand(I, J)
B = np.random.rand(J, K)
C = np.random.rand(I, K)
# All the different i,j,k
combinations = itertools.product(np.arange(I), np.arange(J), np.arange(K))
combinations = np.asarray(list(combinations))
A_vals = A[combinations[:,0], combinations[:,1]]
B_vals = B[combinations[:,1], combinations[:,2]]
C_vals = C[combinations[:,0], combinations[:,2]]
f = np.min([A_vals,B_vals,C_vals],axis=0)
best_indices = combinations[np.argmax(f)]
print(best_indices)
[ 49 14 136]
这比遍历所有(i, j, k) 更快,但是很多(和大部分)时间都花在了构建_vals 矩阵上。这是不幸的,因为它们包含许多重复值,因为相同的i、j 和k 多次出现。有没有办法做到这一点,(1) numpy 的矩阵计算速度可以保持,(2) 我不必构造内存密集型_vals 矩阵。
在其他语言中,您可以构造矩阵,以便它们包含指向 A、B 和 C 的指针,但我不知道如何在 Python 中实现这一点。
编辑:查看后续问题以获取更多索引here
【问题讨论】:
-
您是否尝试过
numba并遍历矩阵?在小矩阵示例上编译它并在更大的矩阵上计时 -
@dankal444 我试过了,但是很多时间都花在了
numba无法转换的itertools上。不过,我会尝试将它与下面的答案结合起来! -
是的,完全不需要itertools,只需要在numba修饰函数中使用三个
for函数,分别对应i、j和k
标签: python numpy matrix optimization memory