在特定子阵列处评估数组

时间:2014-07-07 18:42:25

标签: python numpy

我提前警告:此刻我可能完全糊涂了。我讲一个关于我实际尝试实现的简短故事,因为这可能会让事情变得清晰起来。说我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):而不是为每个其他输入选择最佳ee是固定的并且给定(大小为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]显然不是我想要的。

效果至关重要。

2 个答案:

答案 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并不占据整个空间,正如我们在评论中所讨论的那样。如果您想为所有eabc选择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