我提前警告:此刻我可能完全糊涂了。我讲一个关于我实际尝试实现的简短故事,因为这可能会让事情变得清晰起来。说我f(a,b,c,d,e)
,我想找arg max (d,e) f(a,b,c,d,e)
。考虑F
的离散化网格f
的(一个简单例子):
F = np.tile(np.arange(0,10,0.1)[newaxis,newaxis,:,newaxis,newaxis], [10, 10, 1, 10, 10])
maxE = F.max(axis=-1)
argmaxD = maxE.argmax(axis=-1)
maxD = F.max(axis=-2)
argmaxE = maxD.argmax(axis=-1)
这是我通常如何解决离散化版本的情况。但现在假设我要解决arg max d f(a,b,c,d,e=X)
:而不是为每个其他输入选择最佳e
,e
是固定的并且给定(大小为AxBxCxD,在此示例中为是10x10x100x10
)。解决这个问题我遇到了麻烦。
我天真的做法是
X = np.tile(np.arange(0,10)[newaxis,newaxis,:,newaxis], [10,10,1,10])
maxX = F[X]
argmaxD = maxX.argmax(axis=-1)
然而,崩溃我的IDE的大量内存意味着F[X]
显然不是我想要的。
效果至关重要。
答案 0 :(得分:2)
我相信你可以这样做,但也许有更好的方法......
n = 10
F = np.tile(np.arange(0,n,0.1)[None,None,:,None,None], [n, n, 1, n, n])
X = np.tile(np.arange(0,n)[None,None,:,None], [n, n, 1, n])
a,b,c,d = np.ogrid[:n,:n,:n,:n]
argmaxD = F[a,b,c,d,X].argmax(axis=-1)
上面X
并不占据整个空间,正如我们在评论中所讨论的那样。如果您想为所有e
,a
,b
和c
选择d
,例如:。
X = np.tile(np.arange(0,n,0.1).astype(int)[None,None,:,None], [n, n, 1, n])
a,b,c,d = np.ogrid[:n,:n,:100,:n]
argmaxD = F[a,b,c,d,X].argmax(axis=-1)
另外,请注意,您可以使用广播而不是tile
。但是F[a,b,c,d,X]
具有单一维度,因此您应该提供类似axis=3
:
X = np.arange(0,n,0.1).astype(int)[None,None,:,None]
a,b,c,d = np.ogrid[:n,:n,:100,:n]
argmaxD = F[a,b,c,d,X].argmax(axis=3)
答案 1 :(得分:0)
这是我解决这个问题的想法。
from itertools import product, starmap
f = lambda a,b,c,d,e : d / e
args_iterable = product([1],[2],[3],range(1,1000),range(1,1000))
max_val, max_args = max(starmap(lambda *args: (f(*args), args) , args_iterable))
print max_args