从 numpy 行向量中切片每第 5 个和第 6 个元素

Slicing every 5th and 6th element from a numpy row vector

我有一个这样的数组:A = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) 并且想从此行向量中每隔 5 个 "and" 提取第 6 个元素,从而得到 B = ([4,5,9,10,14,15])

我知道如何提取每第 5 个元素:B = A[::5] 但不知道如何一个接一个地提取两个值。

您可以使用:

A[4::5]

得到array([ 4, 9, 14]),然后用A[::5]连接排序。

一种使用 numpy 的方法:

import numpy as np
A = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])

ids = np.ravel(np.array([np.array([4,5]) + i * np.array([5,5]) for i in range(3)] ))

A[ids]
array([ 4,  5,  9, 10, 14, 15])

你写了每第 5 个和第 6 个元素,所以我按以下方式解开它:

  • 将源系列分成"parts",每个6个元素,
  • 从每个 "part" 中取最后 2 个元素(第 5 个和第 6 个)。

所以预期的结果是(与你写的略有不同):

  • 45 - 0 到 [=30= 部分的最后 2 个元素]5,
  • 1011 - 6 到 [=30= 部分的最后 2 个元素]11,
  • 16 - 从第三部分(1217)只取 16, 因为 来源 Series 不包含 17.

要仅获取这些元素,您可以 运行:

pd.concat([s[4::6], s[5::6]]).sort_index().tolist()

详情:

  • s[4::6] - 从第 5 个开始的每第 6 个元素(注意索引 从 0),
  • 开始
  • s[5::6] - 从第 6 个开始的每第 6 个元素。
  • concat(...) - 连接这 2 个结果,
  • sort_index() - 恢复原来的顺序(假设源 系列 有一个有序索引),
  • tolist() - 将上面的结果 (a Series) 转换为普通的 list.

对于您的数据样本,结果是:

[4, 5, 10, 11, 16]

其他可能的解决方案,这次基于拆分源系列 分成大小为 6 的部分,并从中获取元素号 56 (如果有的话) 每部分:

np.concatenate([ tt[4:] for tt in np.array_split(s.values, np.ceil(s.size / 6)) ]).tolist()

您可以构建一个掩码并使用掩码提取元素:

mask = (np.arange(len(A))%6 == np.array([[4],[5]])).any(0)
A[mask]
# array([ 4,  5, 10, 11, 16])