Arrays numpy是否有可能替换for循环以提高性能?

Arrays numpy是否有可能替换for循环以提高性能?,arrays,python-3.x,numpy,optimization,dataset,Arrays,Python 3.x,Numpy,Optimization,Dataset,一般来说,有没有办法用numpy或python来提高这段代码的性能? 目标是建立一个培训集功能是原始数据。我想使用跨步长度为1的移动窗口方法来“丰富”数据。最后,我希望将数据从二维数组重新整形为三维数组,因为一个训练输入具有shape(windowSize,features.shape[1]) 这个解决方案通过使用NumPy索引避免了所有的循环等等 import numpy as np windowSize = 4 features = np.array( [[ 1, 2],

一般来说,有没有办法用numpy或python来提高这段代码的性能? 目标是建立一个培训集<代码>功能是原始数据。我想使用跨步长度为1的移动窗口方法来“丰富”数据。最后,我希望将数据从二维数组重新整形为三维数组,因为一个训练输入具有shape
(windowSize,features.shape[1])


这个解决方案通过使用NumPy索引避免了所有的循环等等

import numpy as np

windowSize = 4
features = np.array(
    [[ 1,  2], 
     [ 3,  4],
     [ 5,  6],
     [ 7,  8],
     [ 9, 10],
     [11, 12],
     [13, 14],
     [15, 16],
     [17, 18],
     [19, 20]]
)

indices = np.add.outer(np.arange(len(features) - windowSize + 1), np.arange(windowSize))
# indices:
# [[0 1 2 3]
#  [1 2 3 4]
#  [2 3 4 5]
#  [3 4 5 6]
#  [4 5 6 7]
#  [5 6 7 8]
#  [6 7 8 9]]
features[indices] # indices must be of type np.ndarray or this won't work
# features[indices]:
# [[[ 1  2]
#   [ 3  4]
#   [ 5  6]
#   [ 7  8]]

#  [[ 3  4]
#   [ 5  6]
#   [ 7  8]
#   [ 9 10]]

#  [[ 5  6]
#   [ 7  8]
#   [ 9 10]
#   [11 12]]

#  [[ 7  8]
#   [ 9 10]
#   [11 12]
#   [13 14]]

#  [[ 9 10]
#   [11 12]
#   [13 14]
#   [15 16]]

#  [[11 12]
#   [13 14]
#   [15 16]
#   [17 18]]

#  [[13 14]
#   [15 16]
#   [17 18]
#   [19 20]]]
应该注意的是,您的代码输出的内容与我的不同,我认为这可能是一个错误,因为您的最后一部分是:

print(featuresReshaped[-1])
# [[15 16]
#  [17 18]
#  [19 20]
#  [17 18]]]

这与您提供的“移动窗口”描述不一致。

我尝试了底部的
print(featuresreformed)
,底部的切片(
featuresreformed[-1]
)稍微打破了移动窗口模式,应该是这样吗?使用repsited
vstack
很慢。收集列表中的窗口,最后只执行一个
vstack
。虽然后续操作可能会强制复制,但可以使用移动的
窗口
视图
(或使用该窗口的窗口函数)创建移动的
。@hpaulj感谢您的回复。我不完全明白。你能给我看一个代码示例吗?很好,谢谢!这样,速度大约快4756倍。:)我知道。我的实现去掉了最后一部分。你在哪里学会正确使用numpy的?你能给我指个方向吗?:)@Pm740很高兴知道它有帮助!我主要是通过经验学习的(我为个人项目和研究做了很多数值计算)。我有点痴迷于“酷酷的numpy技巧”,所以每次我看到有人用numpy做了一些有趣的事情(我不理解),我总是尽力去理解代码。我使用的大多数技巧通常是numpy索引和广播的某种组合,这在这里有很好的文档记录。祝你学习numpy好运!
print(featuresReshaped[-1])
# [[15 16]
#  [17 18]
#  [19 20]
#  [17 18]]]