这是一个间接索引的问题。
它可以用一个列表理解来解决。
现在的问题是,是否或如何numpy的范围内解决这个问题,
当data.shape
是(T,N)
和c.shape
是(T,K)
和中的每个元素c
是int
0和N-1(含)之间,即,各元件c
是指从一个列号data
。
我们的目标是获得out
哪里
out.shape = (T,K)
并为每个i
在0..(T-1)
行out[i] = [ data[i, c[i,0]] , ... , data[i, c[i,K-1]] ]
具体的例子:
data = np.array([\
[ 0, 1, 2],\
[ 3, 4, 5],\
[ 6, 7, 8],\
[ 9, 10, 11],\
[12, 13, 14]])
c = np.array([
[0, 2],\
[1, 2],\
[0, 0],\
[1, 1],\
[2, 2]])
out should be out = [[0, 2], [4, 5], [6, 6], [10, 10], [14, 14]]
出的第一行是[0,2],因为所选择的列由C'S行0给出的,它们是0和2,以及数据[0],在列0和2是0和2。
出的第二行是[4,5],因为所选择的列由C'S行1中给出,它们是1和2,以及数据[1],在列1和2是4和5。
numpy的花式索引似乎没有在明显的方式来解决这个由于采用c索引数据(例如, data[c]
np.take(data,c,axis=1)
总是产生一个3维阵列。
列表解析可以解决这个问题:
out = [ [data[rowidx,i1],data[rowidx,i2]] for (rowidx, (i1,i2)) in enumerate(c) ]
如果K 2我想这是边际确定。 如果K是可变的,这也不是那么好。
该列表理解已被改写为每个值K,因为它解开列挑选出来的data
通过每一行c
。 这也违背了DRY原则。
是否有完全基于在溶液中numpy
?