【发布时间】:2021-11-25 19:42:12
【问题描述】:
我想最大化以下功能:
f(i, j, k) = min(A(i, j), B(j, k))
其中A 和B 是矩阵,i、j 和k 是范围高达矩阵各自维度的索引。我想找到(i, j, k) 以使f(i, j, k)最大化。我目前这样做如下:
import numpy as np
import itertools
shape_a = (100 , 150)
shape_b = (shape_a[1], 200)
A = np.random.rand(shape_a[0], shape_a[1])
B = np.random.rand(shape_b[0], shape_b[1])
# All the different i,j,k
combinations = itertools.product(np.arange(shape_a[0]), np.arange(shape_a[1]), np.arange(shape_b[1]))
combinations = np.asarray(list(combinations))
A_vals = A[combinations[:, 0], combinations[:, 1]]
B_vals = B[combinations[:, 1], combinations[:, 2]]
f = np.min([A_vals, B_vals], axis=0)
best_indices = combinations[np.argmax(f)]
print(best_indices)
[ 49 14 136]
这比遍历所有(i, j, k) 更快,但是很多(并且大部分)时间都花在了构建A_vals 和B_vals 矩阵上。这是不幸的,因为它们包含许多重复值,因为相同的 i、j 和 k 多次出现。有没有办法做到这一点,(1) numpy 的矩阵计算速度可以保持,(2) 我不必构造内存密集型 A_vals 和 B_vals 数组。
在其他语言中,您也许可以构造矩阵,以便它们包含指向 A 和 B 的指针,但我不知道如何在 Python 中实现这一点。
【问题讨论】:
-
请考虑选择这个问题的答案,这样它就不会永远在未回答的队列中。这个和你的许多其他问题都有很好的答案。
-
@MadPhysicist 我会的,可能明天等我看清楚了!
标签: python numpy matrix optimization memory