【发布时间】:2017-03-14 18:27:02
【问题描述】:
给定一个形状为 (2,n,m) 的数组 x 和一组索引 [i,j],其中i,j ,我正在尝试获取形状为 (2,m) 的数组,其中第一个数组位于索引 [0,i],第二个数组位于索引 [1,j]。这是一个用于泛化到形状为 (b,n,m) 的数组和一组长度为 b 的索引的测试用例。
此操作的明显选择是 np.choose,但这与预期的不同。我们希望将第一个数组的行 i 与第二个数组的行 j 配对。但是,当使用 np.choose([i,j],x) 时,np.choose 会与 中的第一个 column 配对具有索引 i 的数组 与具有索引 j 的 array 的第二列(可以在下面的代码中看到)到得到一个形状为 (n,m) 的数组。显然,使用 for 循环很容易执行此任务,但由于用例(在 Keras 中作为张量的自定义函数,禁止迭代),我不能这样做。是否有使用 Keras 后端函数或 Numpy 执行此操作的矢量化方式?我目前正在考虑使用“地图”来执行此操作,如果我弄明白了,我会用我自己的答案进行更新。
这里有一段代码 sn-p 向您展示 np.choose 如何处理 (2,n,m) 数组:
>>> import numpy as np
>>> x = np.random.rand(2,4,2)
>>> choices = [3,1]
>>> np.choose(choices,x)
ValueError: invalid entry in choice array
>>> np.choose([0,0],x)
#Returns an array with x[0,:,0] and x[0,:,1] in shape(4,2)
【问题讨论】:
-
你有工作循环代码吗?
-
@Divakar 是的,我愿意,但这是针对我正在执行的整体任务(找到包含“n”个单独的 softmax 输出的批次“b”的最大概率输出)。这是该函数矢量化的最后一步。我是否也应该提供整体功能的代码?在这一点上似乎无关紧要,但我想它为这里发生的事情提供了更多的背景。
标签: python arrays numpy vectorization