python - 通过单个索引切片多行

标签 python numpy slice

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

在我的问题中,总是三行代表一个样本,在我的例子中是坐标。

我想以某种方式访问​​这个矩阵,如果我使用 a[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]])

也许这个解决方案可以改进,并且有人不需要堆叠。

最佳答案

如果三行是样本,您可以重新调整数组的形状以反射(reflect)这一点,使用花哨的索引来检索样本,然后撤消形状更改:

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

关于python - 通过单个索引切片多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291451/

相关文章:

python - 快速索引 : Cython with numpy array of bool and str

arrays - 在具有所有唯一值的数组中搜索最短切片,如何以最佳方式执行此操作?

python - python 中文本的 n 元语法

python - Django 上下文处理器登录问题

python - 在pandas中返回 float 而不是ndarray - python

numpy - 使用 numpy 转置向量

python - 使用不同长度的数组列表索引一维数组

arrays - 如何获取数组/字典的切片并追加

Python Jupyter Notebook 无法正确应用函数

python - Pandas 等级法中的力增量