我在numpy中遇到以下切片问题。
a = np.arange(36).reshape(-1,4)
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]])
在我的问题中,总是三行代表一个样本,在我的情况下是坐标。
我想以一种方式访问这个矩阵,如果我使用[0:2]来获得以下内容:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]
这是前两个坐标样本。 我必须从数组中提取大量的这些坐标集。
由于
基于How do you split a list into evenly sized chunks?,我找到了以下解决方案,它为我提供了理想的结果。
def chunks(l, n, indices):
return np.vstack([l[idx*n:idx*n+n] for idx in indices])
chunks(a,3,[0,2])
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]])
可能这个解决方案可以改进,有人不需要堆叠。
答案 0 :(得分:1)
如果三行是样本,您可以重新整形数组以反映它,使用花式索引来检索样本,然后撤消形状更改:
>>> a = a.reshape(-1, 3, 4)
>>> a[[0, 2]].reshape(-1, 4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]])