我有一个数组a,如下所示:

import numpy as np
a= np.array([[1, 3, 5, 7, 8, 7, 1],
   [11, 13, 51, 17, 18, 17, 10]])

我想用滑动窗口建立一个数组列表.以下是我想要的输出:

enter image description here

我使用了以下代码,但它没有提供我想要的输出:

lag           = 3
out = []
for i in range(2):
    eachrow  =[]
    for col in range(a.shape[1]-lag):
        X_row = []
        xtmp = a[i, col:col+lag]
        X_row.append(xtmp)
        ytmp = a[i, col+lag]  
        X_row.append(ytmp)
        eachrow.append(X_row)
    out.append(eachrow)

感谢您的帮助.谢谢

推荐答案

您的代码生成:

In [3]: out
Out[3]: 
[[[array([1, 3, 5]), 7],
  [array([3, 5, 7]), 8],
  [array([5, 7, 8]), 7],
  [array([7, 8, 7]), 1]],
 [[array([11, 13, 51]), 17],
  [array([13, 51, 17]), 18],
  [array([51, 17, 18]), 17],
  [array([17, 18, 17]), 10]]]

这是一个长度为2的列表.在这个列表中.

如果我们从中创建一个数组,使用object个数据类型,我们得到一个3d数组,其中一些元素是数组,一些是整数:

In [6]: arr = np.array(out, object)
In [7]: arr
Out[7]: 
array([[[array([1, 3, 5]), 7],
        [array([3, 5, 7]), 8],
        [array([5, 7, 8]), 7],
        [array([7, 8, 7]), 1]],

       [[array([11, 13, 51]), 17],
        [array([13, 51, 17]), 18],
        [array([51, 17, 18]), 17],
        [array([17, 18, 17]), 10]]], dtype=object)
In [8]: arr.shape
Out[8]: (2, 4, 2)

将代码的一行更改为

     X_row.append(np.array([ytmp]))

In [11]: np.array(out,object)
Out[11]: 
array([[[array([1, 3, 5]), array([7])],
        [array([3, 5, 7]), array([8])],
        [array([5, 7, 8]), array([7])],
        [array([7, 8, 7]), array([1])]],

       [[array([11, 13, 51]), array([17])],
        [array([13, 51, 17]), array([18])],
        [array([51, 17, 18]), array([17])],
        [array([17, 18, 17]), array([10])]]], dtype=object)

或以str/print数组格式显示:

In [12]: print(_)
[[[array([1, 3, 5]) array([7])]
  [array([3, 5, 7]) array([8])]
  [array([5, 7, 8]) array([7])]
  [array([7, 8, 7]) array([1])]]

 [[array([11, 13, 51]) array([17])]
  [array([13, 51, 17]) array([18])]
  [array([51, 17, 18]) array([17])]
  [array([17, 18, 17]) array([10])]]]

我们可以将其reshape 为(8,2)数组(仍然是对象数据类型):

In [14]: print(Out[11].reshape(-1,2))
[[array([1, 3, 5]) array([7])]
 [array([3, 5, 7]) array([8])]
 [array([5, 7, 8]) array([7])]
 [array([7, 8, 7]) array([1])]
 [array([11, 13, 51]) array([17])]
 [array([13, 51, 17]) array([18])]
 [array([51, 17, 18]) array([17])]
 [array([17, 18, 17]) array([10])]]

由于最内部的数组大小不一(大约3到1),因此结果只能是对象数据类型或列表列表.这对于数组计算来说不是最优的.

逗号是显示屏的一部分,还有[]array之类的单词.它们一起为我们提供了关于底层对象的线索,无论它们是列表还是array.同样重要的是形状和数据类型(如果对象是数组)或长度(如果是列表).

===

另一个答案使用striding_tricks函数.下面是更详细的方法.虽然xview,但切片和reshape 可以复制,所以很难说这是否更快.对于这个小例子,我打赌你的代码速度更快,但对于更大的情况,可能不是这样.

In [16]: np.lib.stride_tricks.sliding_window_view(a,(1,4))
Out[16]: 
array([[[[ 1,  3,  5,  7]],

        [[ 3,  5,  7,  8]],

        [[ 5,  7,  8,  7]],

        [[ 7,  8,  7,  1]]],


       [[[11, 13, 51, 17]],

        [[13, 51, 17, 18]],

        [[51, 17, 18, 17]],

        [[17, 18, 17, 10]]]])
In [17]: x = np.lib.stride_tricks.sliding_window_view(a,(1,4))
In [18]: x.shape
Out[18]: (2, 4, 1, 4)

这是原始1d数组的4d view.

您的3号"数组"可以从中分割:

In [19]: x[:,:,0,:3]
Out[19]: 
array([[[ 1,  3,  5],
        [ 3,  5,  7],
        [ 5,  7,  8],
        [ 7,  8,  7]],

       [[11, 13, 51],
        [13, 51, 17],
        [51, 17, 18],
        [17, 18, 17]]])
In [20]: x[:,:,0,:3].reshape(-1,3)
Out[20]: 
array([[ 1,  3,  5],
       [ 3,  5,  7],
       [ 5,  7,  8],
       [ 7,  8,  7],
       [11, 13, 51],
       [13, 51, 17],
       [51, 17, 18],
       [17, 18, 17]])

以及"1元素"列:

In [21]: x[:,:,0,-1].reshape(-1,1)
Out[21]: 
array([[ 7],
       [ 8],
       [ 7],
       [ 1],
       [17],
       [18],
       [17],
       [10]])

这两个数组可能比object out更有用.

[14]中所示的数组可以分为两个类似的数组:

In [27]: np.stack(arr.reshape(-1,2)[:,0])
Out[27]: 
array([[ 1,  3,  5],
       [ 3,  5,  7],
       [ 5,  7,  8],
       [ 7,  8,  7],
       [11, 13, 51],
       [13, 51, 17],
       [51, 17, 18],
       [17, 18, 17]])
In [28]: arr.reshape(-1,2)[:,1].astype(int)
Out[28]: array([ 7,  8,  7,  1, 17, 18, 17, 10])

Python相关问答推荐

如何观察cv2.erode()的中间过程?

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

遵循轮廓中对象方向的计算线

opencv Python稳定的图标识别

拆分pandas列并创建包含这些拆分值计数的新列

提取两行之间的标题的常规表达

使用FASTCGI在IIS上运行Django频道

如何比较numPy数组中的两个图像以获取它们不同的像素

删除最后一个pip安装的包

rame中不兼容的d类型

为什么符号没有按顺序添加?

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

如何在PySide/Qt QColumbnView中删除列

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

跳过嵌套JSON中的级别并转换为Pandas Rame

替换现有列名中的字符,而不创建新列

如何获取Python synsets列表的第一个内容?

Gekko中基于时间的间隔约束

将CSS链接到HTML文件的问题