为 numpy 数组定期切片

slicing periodically for a numpy array

我有一个包含 100 个数字的 numpy 数组 a = np.arange(100)。 我想知道是否有一种方法可以定期对其进行切片而不是使用条件语句。

例如,如果我想将第一个四个数字 + 第五个四个数字 + 第一个四个数字等等进行切片,最后将所有这些都放在一个数组中。

有什么建议吗?

谢谢

代码:

import numpy as np

a = np.arange(100)
grp = 4
grp_no = [1,5,9]
lst = np.array([a[range(n*grp-4, n*grp)] for n in grp_no])
print(lst)
print(lst.flatten()) #if required

输出:

[[ 0  1  2  3]
 [16 17 18 19]
 [32 33 34 35]]
[ 0  1  2  3 16 17 18 19 32 33 34 35]

您想要一个跨步索引 - 我不知道有完全矢量化的 numpy 工具,但它可能存在。

此解决方案从 a 中选择索引 idx_arr。唯一未矢量化(慢)的组件是步幅组上的循环;其他一切都应该很快。特别注意预填充:

nmax = 10000
m = 4
a = np.random.rand(nmax)
_sub_arr = np.arange(m)
idx_arr = np.concatenate([_sub_arr + 4*m for m in range(0, int(nmax/m), 4)])
sol = a[idx_arr]
print(sol)

您可以使用np.resize 将数组转换为二维,然后根据需要对行进行切片。请注意,如果 a 不是 4.

的精确倍数,则会出现边缘情况
import numpy as np

wt = 4
a = np.arange(100)
ht = int(a.size/wt)
a.resize(ht, wt)
n = a[0::4,].flatten()
print(n)

输出:

[ 0  1  2  3 16 17 18 19 32 33 34 35 48 49 50 51 64 65 66 67 80 81 82 83
 96 97 98 99]