如何提取 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]
是 b
从 i
到 m-(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
是它们按相同顺序排列的频率。
我正在尝试更好地使用 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]
是 b
从 i
到 m-(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
是它们按相同顺序排列的频率。