我有一个矩阵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.]]
答案 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)))]