接从TXN numpy的阵列TXK numpy的阵列使用TXK列索引阵列(pick TxK nump

2019-10-21 02:29发布

这是一个间接索引的问题。

它可以用一个列表理解来解决。

现在的问题是,是否或如何numpy的范围内解决这个问题,

data.shape(T,N)c.shape(T,K)

和中的每个元素cint 0和N-1(含)之间,即,各元件c是指从一个列号data

我们的目标是获得out哪里

out.shape = (T,K)

并为每个i0..(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

Answer 1:

您可避免与循环np.choose :

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.

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]])
--

In [2]: np.choose(c, data.T[:,:,np.newaxis])
Out[2]: 
array([[ 0,  2],
       [ 4,  5],
       [ 6,  6],
       [10, 10],
       [14, 14]])


Answer 2:

下面是一个通用的解决方案的一种可能的途径......

创建口罩的data来选择的每一列中的值out 。 例如,第一掩模可以通过书面形式来实现:

>>> np.arange(3) == np.vstack(c[:,0])
array([[ True, False, False],
       [False,  True, False],
       [ True, False, False],
       [False,  True, False],
       [False, False,  True]], dtype=bool)

>>> data[_]
array([ 2,  5,  6, 10, 14])

掩模,以获得值的第二列outnp.arange(3) == np.vstack(c[:,1])

因此,要获得该out阵列...

>>> mask0 = np.arange(3) == np.vstack(c[:,0])
>>> mask1 = np.arange(3) == np.vstack(c[:,1])
>>> np.vstack((data[mask0], data[mask1])).T
array([[ 0,  2],
       [ 4,  5],
       [ 6,  6],
       [10, 10],
       [14, 14]])

编辑 :给定任意阵列宽度KN你可以使用一个循环创造了口罩,所以一般建设out阵列可能仅仅是这样的:

np.vstack([data[np.arange(N) == np.vstack(c[:,i])] for i in range(K)]).T

编辑2:稍微更整洁溶液(尽管仍然依靠循环)为:

np.vstack([data[i][c[i]] for i in range(T)])


文章来源: pick TxK numpy array from TxN numpy array using TxK column index array