如何提取 window 大小的重叠子数组并将它们展平

how to extract overlapping sub-arrays with a window size and flatten them

我正在尝试更好地使用 numpy 函数和方法来 运行 我在 python 中的程序更快

我想做以下事情:

我创建一个数组 'a' 作为:

a=np.random.randint(-10,11,10000).reshape(-1,10) 

a.shape: (1000,10)

我创建了另一个数组,它只包含数组 a 的前两列

b=a[:,0:2] 

b,形状: (1000,2)

现在我想创建一个数组 c,它有 990 行,包含 10 行数组 'b' 的扁平切片。 所以数组 'c' 的第一行将有 20 列,这是一个 0 到 10 行的扁平切片 数组 'b'。数组 'c' 的下一行将有 20 列扁平化的数组的第 1 到 11 行 'b'等

我可以用 for 循环来做到这一点。但我想知道是否有更快的方法使用 numpy 函数和方法(如 strides 或其他方法)

感谢您的宝贵时间和帮助。

这循环遍历移位而不是行(大小为 10 的循环):

N = 10
c = np.hstack([b[i:i-N] for i in range(N)])  

解释:b[i:i-N]bim-(N-i) 的行(不包括 m-(N-i) 本身),其中 m 是数字b 中的行数。然后 np.hstack 水平堆叠这些选定的子阵列(堆叠 b[0:m-10]b[1:m-9]b[2:m-8]、...、b[10:m])(如问题所述)。

c.shape: (990, 20)

此外,如果您想包含所有 windows。

,我认为您可能正在寻找 (991, 20) 的形状

你也可以使用步幅,但如果你想对其进行操作,我建议不要这样做,因为使用它们会占用内存。如果您坚持,这里有一个大步解决方案:

from skimage.util.shape import view_as_windows
c = view_as_windows(b, (10,2)).reshape(-1, 20)

c.shape: (991, 20)

如果您不想要最后一行,只需调用 c[:-1].
将其删除 类似的解决方案适用于 numpy 的 as_strides 函数(它们基本上操作相似,不确定它们的内部结构)。

UPDATE:如果你想在 c 的每一行中找到唯一值及其频率,你可以这样做:

unique_values = []
unique_counts = []
for row in c:
  unique, unique_c = np.unique(row, return_counts=True)
  unique_values.append(unique)
  unique_counts.append(unique_c)

请注意,numpy 数组必须是矩形的,这意味着每个(维度)行的元素数必须相同。由于 c 中的不同行可以具有不同数量的唯一值,因此您不能为每行的唯一值创建一个 numpy 数组(替代方法是制作一个结构化的 numpy 数组)。因此,一个解决方案是制作一个 list/array 数组,每个数组包含 c 中不同行的唯一值。 unique_values 是唯一值数组的列表,unique_counts 是它们按相同顺序排列的频率。