Numpy:在矩阵中提取特定行

时间:2014-11-18 09:58:09

标签: python numpy scipy

我有一个矩阵W和两个向量y1和y2。我想从W中提取行。我感兴趣的行在[y1:y2]范围内。在Numpy中这样做的最佳方式是什么? 可以在不使用任何for循环或地图方法的情况下完成吗?例如:

W = [[   1.,    2.,    3.,    4.],
 [   5.,    6.,    7.,    8.],
 [   9.,   10.,   11.,   12.],
 [  13.,   21.,   33.,   41.],
 [  55.,   66.,   74.,   83.],
 [  92.,  106.,  711.,  142.],
 [  19.,   27.,   33.,   24.],
 [  54.,   66.,   74.,   38.],
 [  29.,  210.,  131.,  412.]]

y1 = [[0],
 [0],
 [6],
 [3]]

y2 = [[3],
 [3],
 [9],
 [6]]

I want w[y1:y2,:] ., i.e.

newW = [[   1.,    2.,    3.,    4.],
 [   5.,    6.,    7.,    8.],
 [   9.,   10.,   11.,   12.],
 [   1.,    2.,    3.,    4.],
 [   5.,    6.,    7.,    8.],
 [   9.,   10.,   11.,   12.],
 [  19.,   27.,   33.,   24.],
 [  54.,   66.,   74.,   38.],
 [  29.,  210.,  131.,  412.],
 [  13.,   21.,   33.,   41.],
 [  55.,   66.,   74.,   83.],
 [  92.,  106.,  711.,  142.]]

2 个答案:

答案 0 :(得分:1)

您需要为自己构建切片作为索引,然后使用它们:

indices = np.concatenate([np.arange(iy1, iy2) for iy1, iy2 in zip(y1.ravel(), y2.ravel())]
newW = w[indices]

答案 1 :(得分:0)

如果您愿意使用列表推导来生成索引,那么您可以使用:

w[np.array([np.arange(i,j) for i,j in np.hstack((y1,y2))]).ravel()]

如果你真的不能使用循环,请尝试:

a = np.hstack((y1,y2))
func = lambda i: np.arange(a[i][0],a[i][1])
b = np.vectorize(func,otypes=[np.ndarray])
w[np.hstack(b(np.arange(4)))]