Python 获取numpy数组的所有子序列
给定一个大小为Python 获取numpy数组的所有子序列,python,arrays,numpy,Python,Arrays,Numpy,给定一个大小为n的numpy数组和一个整数m,我想生成数组的所有连续m长度子序列,最好是二维数组 例如: 我能想出的最好办法就是 是否有一个更好的、最好是内置的、我缺少的函数?基于迭代器的函数 基于切片的 你在正确的轨道上 您可以利用以下广播技巧,从两个1dimaranges创建一个2dimindex数组: arr = arange(7)[::-1] arr => array([6, 5, 4, 3, 2, 1, 0]) n = arr.size m = 3 indices = ar
n
的numpy数组和一个整数m
,我想生成数组的所有连续m
长度子序列,最好是二维数组
例如:
我能想出的最好办法就是
是否有一个更好的、最好是内置的、我缺少的函数?基于迭代器的函数
基于切片的
你在正确的轨道上 您可以利用以下广播技巧,从两个1dim
arange
s创建一个2dimindex
数组:
arr = arange(7)[::-1]
arr
=> array([6, 5, 4, 3, 2, 1, 0])
n = arr.size
m = 3
indices = arange(m) + arange(n-m+1).reshape(-1, 1) # broadcasting rulez
indices
=>
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
arr[indices]
=>
array([[6, 5, 4],
[5, 4, 3],
[4, 3, 2],
[3, 2, 1],
[2, 1, 0]])
这样做
from scipy.linalg import hankel
def subsequences(v, m):
return hankel(v[:m], v[m-1:])
这是一种非常快速且节省内存的方法,它只是原始阵列的“视图”:
from numpy.lib.stride_tricks import as_strided
def subsequences(arr, m):
n = arr.size - m + 1
s = arr.itemsize
return as_strided(arr, shape=(m,n), strides=(s,s))
如果需要写入此数组,应先创建np.copy
,否则将修改原始数组以及“subsequences”数组中的相应条目
此处的更多信息:在问题中,您表示需要
m
length子序列,但在示例中,m
是子序列的数量,而不是它们的长度。@logc我希望列是m length子序列,也就是说,看看这一子序列的可转置副本肯定比我当时的做法要好,但使用内置的scipy工具似乎是基于切片的方法的最佳选择,而且它的性能似乎明显低于索引方法。总的来说,我认为与仅对numpy数据类型进行操作相比,从numpy阵列到numpy阵列的转换成本更高。谢谢你的建议!
import numpy as np
def subsequences(iterable, b):
return np.array([iterable[i:i + b] for i in range(len(iterable) - b + 1)]).T
print subsequences(np.arange(10), 4)
arr = arange(7)[::-1]
arr
=> array([6, 5, 4, 3, 2, 1, 0])
n = arr.size
m = 3
indices = arange(m) + arange(n-m+1).reshape(-1, 1) # broadcasting rulez
indices
=>
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
arr[indices]
=>
array([[6, 5, 4],
[5, 4, 3],
[4, 3, 2],
[3, 2, 1],
[2, 1, 0]])
from scipy.linalg import hankel
def subsequences(v, m):
return hankel(v[:m], v[m-1:])
from numpy.lib.stride_tricks import as_strided
def subsequences(arr, m):
n = arr.size - m + 1
s = arr.itemsize
return as_strided(arr, shape=(m,n), strides=(s,s))