Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取numpy数组的所有子序列_Python_Arrays_Numpy - Fatal编程技术网

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创建一个2dim
index
数组:

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))