Numpy(或Theano)中的切片矩阵

时间:2017-03-14 19:49:15

标签: python python-2.7 numpy theano

在每个列的起始索引给定的情况下,是否有一种最佳方法可以将Numpy(或Theano)中矩阵的每一行按步幅N切片?

例如,在下面的矩阵A中,第一列中给出了每行的起始切片索引,而对于行i,我想要A[i, A[0]:A[0]+stride]

A = [[1,  1,  2,  3,  4, 5, 6],
     [1,  11, 12, 13, 14, 15, 16],
     [3,  22, 23, 24, 25, 26, 27]]
stride = 2
Desired output:
[[  1.   2.   3.]
 [ 11.  12.  13.]
 [ 24.  25.  26.]]

我尝试了以下代码:

b = [range(A.shape[0]), A[:, 0]]
c = [range(A.shape[0]), A[:, 0] + stride]
A[b:c]

但我收到以下错误:

IndexError: failed to coerce slice entry of type list to integer

2 个答案:

答案 0 :(得分:1)

这是一个矢量化方法,利用broadcasting来获取这些索引,以便将索引编入每行的列,然后使用NumPy's advanced-indexing以矢量化的方式从每行中提取出这些元素 -

idx = A[:,0,None] + np.arange(stride+1)
out = A[np.arange(idx.shape[0])[:,None], idx]

示例运行 -

In [273]: A
Out[273]: 
array([[ 1,  1,  2,  3,  4,  5,  6],
       [ 1, 11, 12, 13, 14, 15, 16],
       [ 3, 22, 23, 24, 25, 26, 27]])

In [274]: idx = A[:,0,None] + np.arange(stride+1)

In [275]: idx
Out[275]: 
array([[1, 2, 3],
       [1, 2, 3],
       [3, 4, 5]])

In [276]: A[np.arange(idx.shape[0])[:,None], idx]
Out[276]: 
array([[ 1,  2,  3],
       [11, 12, 13],
       [24, 25, 26]])

答案 1 :(得分:0)

不确定它是否是最佳的,但至少它不会引发任何错误:)

ArrayList