从 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 个)。
所以预期的结果是(与你写的略有不同):
- 4 和 5 - 0 到 [=30= 部分的最后 2 个元素]5,
- 10 和 11 - 6 到 [=30= 部分的最后 2 个元素]11,
- 16 - 从第三部分(12 到 17)只取 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 的部分,并从中获取元素号 5 和 6 (如果有的话)
每部分:
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])
我有一个这样的数组: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 个)。
所以预期的结果是(与你写的略有不同):
- 4 和 5 - 0 到 [=30= 部分的最后 2 个元素]5,
- 10 和 11 - 6 到 [=30= 部分的最后 2 个元素]11,
- 16 - 从第三部分(12 到 17)只取 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 的部分,并从中获取元素号 5 和 6 (如果有的话) 每部分:
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])