婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何在向量化NumPy數組上進行移動窗口

如何在向量化NumPy數組上進行移動窗口

熱門標簽:江西省地圖標注 外呼系統哪些好辦 武漢外呼系統平臺 如何申請400電話費用 沈陽防封電銷卡品牌 富錦商家地圖標注 沈陽人工外呼系統價格 池州外呼調研線路 沈陽外呼系統呼叫系統

今天很有可能你已經做了一些使用滑動窗口(也稱為移動窗口)的事情,而你甚至不知道它。例如:許多編輯算法都是基于移動窗口的。

在GIS中做地形分析的大多數地形柵格度量(坡度、坡向、山坡陰影等)都基于滑動窗口。很多情況下,對格式化為二維數組的數據進行分析時,都很有可能涉及到滑動窗口。

滑動窗口操作非常普遍,非常有用。它們也很容易在Python中實現。學習如何實現移動窗口將把你的數據分析和爭論技能提升到一個新的水平。

什么是滑動窗?

下面的例子顯示了一個3×3(3×3)滑動窗口。用紅色標注的數組元素是目標元素。這是滑動窗口將計算的新度量的數組位置。例如,在下面的圖像中,我們可以計算灰色窗口中9個元素的平均值(平均值也是8),并將其分配給目標元素,用紅色標出。你可以計算最小值(0)、最大值(16)或其他一些指標,而不是平均值。對數組中的每個元素都這樣做。

就是這樣。這就是滑動窗口的基本原理。當然,事情可能變得更加復雜。有限差分方法可以用于時間和空間數據。邏輯可以實現??梢允褂酶蟮拇翱诖笮』蚍钦叫未翱?。你懂的。但在其核心,移動窗口分析可以簡單地總結為鄰居元素的平均值。

需要注意的是,必須為邊緣元素設置特殊的調整,因為它們沒有9個相鄰元素。因此,許多分析都排除了邊緣元素。為簡單起見,我們將在本文中排除邊緣元素。

樣例數組

3x3的滑動窗口

創建一個NumPy數組

為了實現一些簡單的示例,讓我們創建上面所示的數組。首先,導入numpy。

import numpy as np

然后使用arange創建一個7×7的數組,值范圍從1到48。另外,創建另一個包含無數據值的數組,該數組的形狀和數據類型與初始數組相同。在本例中,我使用-1作為無數據值。

a = np.arange(49).reshape((7, 7)) 
b = np.full(a.shape, -1.0)

我們將使用這些數組來開發下面的滑動窗口示例。

通過循環實現滑動窗口

毫無疑問,你已經聽說過Python中的循環很慢,應該盡可能避免。特別是在使用大型NumPy數組時。這是完全正確。盡管如此,我們將首先看一個使用循環的示例,因為這是一種簡單的方法來概念化在移動窗口操作中發生的事情。在你通過循環示例掌握了概念之后,我們將繼續使用更有效的向量化方法。

要實現移動窗口,只需循環遍歷所有內部數組元素,識別所有相鄰元素的值,并在特定的計算中使用這些值。

通過行和列偏移量可以很容易地識別相鄰值。3×3窗口的偏移量如下所示。

行偏移

列偏移

循環中NumPy移動窗口的Python代碼

我們可以用三行代碼實現一個移動窗口。這個例子在滑動窗口內計算平均值。首先,循環遍歷數組的內部行。其次,循環遍歷數組的內部列。第三,在滑動窗口內計算平均值,并將值賦給輸出數組中相應的數組元素。

for i in range(1, a.shape[0]-1):
    for j in range(1, a.shape[1]-1): 
        b[i, j] = (a[i-1, j-1] + a[i-1, j] + a[i-1, j+1] + a[i, j-1] + a[i, j] + a[i, j+1] + a[i+1, j-1] + a[i+1, j] + a[i+1, j+1]) / 9.0

循環后結果

你將注意到結果與輸入數組具有相同的值,但是外部元素沒有被分配數據值,因為它們不包含9個相鄰元素。

[[-1. -1. -1. -1. -1. -1. -1.]
 [-1. 8. 9. 10. 11. 12. -1.]
 [-1. 15. 16. 17. 18. 19. -1.]
 [-1. 22. 23. 24. 25. 26. -1.]
 [-1. 29. 30. 31. 32. 33. -1.] 
 [-1. 36. 37. 38. 39. 40. -1.]
 [-1. -1. -1. -1. -1. -1. -1.]]

向量化滑動窗口

Python中的數組循環通常計算效率低下。通過對通常在循環中執行的操作進行向量化,可以提高效率。移動窗口矢量化可以通過同時抵消數組內部的所有元素來實現。

如下圖所示。每個圖像都有相應的索引。你將注意到最后一張圖像索引了所有內部元素,并且對應的圖像索引了每個相鄰元素的偏移量。



從左到右的偏移索引:[1:-1,:-2],[1:-1,2:],[2 :, 2:]



從左到右的偏移索引:[2 :,:-2],[2 :, 1:-1],[:-2,1:-1]




從左到右的偏移索引:[:-2,2:],[:-2,:-2],[1:-1、1:-1]

Numpy數組上的向量化移動窗口的Python代碼

有了上述偏移量,我們現在可以輕松地在一行代碼中實現滑動窗口。 只需將輸出數組的所有內部元素設置為根據相鄰元素計算所需輸出的函數。

b[1:-1, 1:-1] = (a[1:-1, 1:-1] + a[:-2, 1:-1] + a[2:, 1:-1] + a[1:-1, :-2] + a[1:-1, 2:] + a[2:, 2:] + a[:-2, :-2] + a[2:, :-2] + a[:-2, 2:]) / 9.0

矢量化滑動窗口結果

如你所見,這將得到與循環相同的結果。

[[-1. -1. -1. -1. -1. -1. -1.]
 [-1. 8. 9. 10. 11. 12. -1.]
 [-1. 15. 16. 17. 18. 19. -1.]
 [-1. 22. 23. 24. 25. 26. -1.]
 [-1. 29. 30. 31. 32. 33. -1.]
 [-1. 36. 37. 38. 39. 40. -1.]
 [-1. -1. -1. -1. -1. -1. -1.]]

速度比較

上述兩種方法產生相同的結果,但哪一種更有效?我計算了從5行到100列的數組的每種方法的速度。每種方法對每個測試100次。下面是每種方法的平均時間。

很明顯,向量化的方法更加有效。隨著數組大小的增加,循環的效率呈指數級下降。另外,需要注意的是,一個包含10,000個元素(100行和100列)的數組非常小。

總結

移動窗口計算在許多數據分析工作流程中非常常見。這些計算是非常有用的,非常容易實現。然而,使用循環來實現滑動窗口操作是非常低效的。

向量化的移動窗口實現不僅更高效,而且使用更少的代碼行。一旦掌握了實現滑動窗口的向量化方法,就可以輕松有效地提高工作流程的速度。

補充:Python學習筆記——Numpy數組的移動滑窗,使用as_strided實現

Numpy中移動滑窗的實現

為何需要移動滑窗

在量化投資分析過程中,對歷史數據進行分析是一個必不可少的步驟?;霸跉v史數據分析中的重要性不言而喻。譬如移動平均、指數平滑移動平均、MACD、DMA等等價格指標的計算都無一例外需要用到滑窗。

作為一種非常受歡迎的數據分析工具,pandas中提供了專門的滑窗類:DataFrame.rolling()。通過這個滑窗類,可以非常容易地實現移動平均等等算法,但是,在某些情況下,Pandas的運行速度還是不夠,需要借助Numpy的高效率進一步提升速度,這時候就需要在Numpy中實現滑窗了。

Numpy中的移動滑窗

可惜Numpy并沒有提供直接簡單的滑窗方法,如果使用for-loop來實現滑窗,不僅效率打折扣,而且內存占用也非常大。實際上,Numpy提供了一個非常底層的函數可以用來生成滑窗:Numpy.lib.stride_tricks.as_stried。

移動滑窗的as_strided實現方法

舉一個例子,首先生成一個5000行200列的二維數組,我們需要在這個二維數組上生成一個寬度為200的滑窗,也就是說,第一個窗口包含前0~199行數據,第二個窗口包含1~200行,第三個窗口包含2~201行,以此類推,一共4801組:

In [106]: d = np.random.randint(100, size=(5000,200))

如果使用as_strided函數生成上述滑窗,需要用下面的代碼,它生成一個三維數組,包括4801組200X200的矩陣,每一組200X200的矩陣代表一組滑窗:

In [107]: %timeit sd = as_strided(d, (4801,200,200), (200*8, 200*8, 8))
5.97 µs ± 33.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

我們再嘗試一下用for-loop的方法生成一個滑窗檢驗一下前面生成的滑窗是否正確:

In [108]: %%timeit
     ...: sd2 = np.zeros((4801,200,200))
     ...: for i in range(4801):
     ...:     sd2[i] = d[i:i+200]
     ...: 
722 ms ± 98.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [109]: np.allclose(sd, sd2)
Out[109]: True

從上面的代碼可以看出,使用as_strided生成一組滑窗,速度竟然是for-loop的十萬倍以上!那么as_strided是如何做到的呢?

關于as_strided函數的詳細解析

as_strided是怎么回事呢?看它的函數解釋:

Signature: as_strided(x, shape=None, strides=None, subok=False, writeable=True)
Docstring:
Create a view into the array with the given shape and strides.

.. warning:: This function has to be used with extreme care, see notes.

Parameters
----------
x : ndarray
Array to create a new.
shape : sequence of int, optional
The shape of the new array. Defaults to "x.shape".
strides : sequence of int, optional
The strides of the new array. Defaults to "x.strides".
subok : bool, optional
If True, subclasses are preserved.
writeable : bool, optional
If set to False, the returned array will always be readonly. Otherwise it will be writable if the original array was. It is advisable to set this to False if possible (see Notes).

Returns
-------
view : ndarray

這個函數接受的第一個參數是一個數組,第二個參數是輸出的數據shape,第三個參數是stride。要控制數據的輸出,shape和stride都非常重要

shape的含義非常簡單,就是指輸出的數據的行、列、層數,這個參數是一個元組,元組的元素數量等于數組的維度。

而stride的含義就相對復雜一些,其實它的含義是指“步幅”,意思是每一個維度的數據在內存上平移的字節數量。

因為數組在內存中的存放方式是一維線性方式存放的,因此要訪問數組中的某個數字就需要知道平移到哪一個內存單元,ndarray通過stride“步幅”來指定這個平移的幅度。

在as_strided函數中,stride也是一個元組,其元素的數量必須跟shape的元素數量相同,每一個元素就代表該維度的每一個數據相對前一個數據的內存間隔。

舉個例子:

In [188]: d = np.random.randint(10, size=(5,3))

In [189]: d
Out[189]: 
array([[4, 4, 6],
       [2, 9, 3],
       [5, 1, 1],
       [2, 0, 0],
       [9, 2, 3]])


地址0 地址1 地址2 地址3 地址4 地址5 地址6 地址7 地址8 地址9 地址A 地址B 地址C 地址D 地址E
4 4 5 2 9 3 5 1 1 2 0 0 9 2 3

我們之所以看到一個二維數組,是因為numpy數組的shape為(5, 3),stride為(24, 8),意思是說,我們看到的數據有5行3列,對應shape的(5, 3),每一行與前一行間隔24個字節(其實就是三個數字,因為每一個int類型占據8字節,而每一列數字比前一列相差8字節(1個數字)

理解上面的含義以后,也就能理解如何生成一個數據滑窗了,如果我們需要生成一個2X3的數據滑窗,在d上滑動,實際上可以生成一個4組,2行3列的數據視圖,第一組覆蓋d的第0、1兩行,第二層覆蓋d的第1、2兩行,第三層覆蓋d的第2、3兩行……這樣就形成了數據滑窗的效果,我們只要在新的數據視圖上遍歷,就能遍歷整個滑窗。這樣做的好處是,在整個遍歷的過程中完全不需要對數據進行任何移動或復制的操作,因此速度飛快。

根據上面的思路,我們需要生成一個新的數據視圖,其shape為(4, 2, 3)代表4組(從頭到尾滑動4次),2行3列(滑窗的尺寸)

接下來需要確定stride,如前所述stride同樣是一個包含三個元素的元組,第一個元素是兩層數據之間的內存間隔,由于我們的滑窗每滑動一次下移一行,因此層stride應該是平移三個數字,也就是24個字節,行stride和列stride與原來的行列stride一致,因為我們需要原樣看到按順序的數字,因此,新的stride就是:(24, 24, 8)

我們來看看這個新的數據視圖是什么樣子:

In [190]: as_strided(d, shape=(4,2,3), strides=(24,24,8))
Out[190]: 
array([[[4, 4, 6],
        [2, 9, 3]],

       [[2, 9, 3],
        [5, 1, 1]],

       [[5, 1, 1],
        [2, 0, 0]],

       [[2, 0, 0],
        [9, 2, 3]]])

看!一個數據滑窗正確地出現了!

使用as_strided函數的危險之處

使用s_strided函數的最大問題是內存讀取風險,在as_strided生成新的視圖時,由于直接操作內存地址(這一點像極了C的指針操作),而且它并不會檢查內存地址是否越界,因此如果稍有不慎,就會讀到別的內存地址。關鍵是,如果不設置可讀參數,還能直接對內存中的數據進行操作,這樣就帶來了無比大的風險。了解這個風險對正確操作至關重要!

例如,使用下面的stride會直接溢出到其他的未知內存地址上,并讀取它的值,甚至還可以直接修改它:

In [194]: as_strided(d, shape=(5,2,3), strides=(24,24,8))
Out[194]: 
array([[[               4,                4,                6],
        [               2,                9,                3]],

       [[               2,                9,                3],
        [               5,                1,                1]],

       [[               5,                1,                1],
        [               2,                0,                0]],

       [[               2,                0,                0],
        [               9,                2,                3]],

       [[               9,                2,                3],
        [2251799813685248,            18963,                0]]])

這時對象的第五組就映射到了三個未知的內存地址上,如果不慎修改了這三個地址上的內容,就可能造成難以預料的問題,如程序崩潰等。

所以,官方才在文檔中鄭重地警告:如果有可能,盡量避免使用as_strided函數

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • numpy 聲明空數組詳解
  • Numpy將二維數組添加到空數組的實現
  • 在NumPy中創建空數組/矩陣的方法
  • NumPy實現ndarray多維數組操作
  • 如何將numpy二維數組中的np.nan值替換為指定的值
  • 解決numpy數組互換兩行及賦值的問題
  • python 將numpy維度不同的數組相加相乘操作
  • python numpy.power()數組元素求n次方案例
  • Python 用NumPy創建二維數組的案例
  • Numpy ndarray 多維數組對象的使用
  • 淺談Python numpy創建空數組的問題

標簽:銅川 通遼 潛江 呂梁 阿里 常德 黑龍江 株洲

巨人網絡通訊聲明:本文標題《如何在向量化NumPy數組上進行移動窗口》,本文關鍵詞  如,何在,向,量化,NumPy,數組,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何在向量化NumPy數組上進行移動窗口》相關的同類信息!
  • 本頁收集關于如何在向量化NumPy數組上進行移動窗口的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品视频一二三区| 裸体一区二区三区| 久久久噜噜噜久久人人看| 国内久久精品视频| 精品日韩99亚洲| 久久久影院官网| 欧美激情一区二区三区不卡| 久久疯狂做爰流白浆xx| 午夜精品福利久久久| 国产日产欧美一区| 欧美日韩在线直播| 亚洲视频香蕉人妖| 婷婷综合久久一区二区三区| 免播放器亚洲一区| 欧美性受xxxx| 色婷婷综合视频在线观看| 另类小说综合欧美亚洲| 日韩一卡二卡三卡国产欧美| 成人免费看视频| 欧美经典一区二区三区| 国产日韩精品一区二区三区在线| 亚洲免费av高清| 亚洲视频一区二区在线| 99久久伊人精品| 欧美日韩亚洲丝袜制服| 欧美日韩一区二区三区在线看| 天天操天天综合网| 日韩一级片在线播放| 久久综合色8888| 日韩欧美中文字幕制服| 视频一区二区不卡| 欧美人伦禁忌dvd放荡欲情| 狠狠狠色丁香婷婷综合激情| 久久精品久久99精品久久| 国内成+人亚洲+欧美+综合在线| 美洲天堂一区二卡三卡四卡视频| 亚洲天堂2014| 国产欧美精品一区| 国产综合色在线视频区| 免费在线观看一区二区三区| 日日嗨av一区二区三区四区| 国产网站一区二区| 一区二区成人在线观看| 日本一区二区三区dvd视频在线| 粉嫩欧美一区二区三区高清影视 | 日本sm残虐另类| 青青草97国产精品免费观看 | 99久久国产免费看| 久久久一区二区| 久久国产生活片100| fc2成人免费人成在线观看播放 | 一区二区三区在线视频观看| 男女男精品视频网| 国产乱色国产精品免费视频| 日韩理论电影院| 天堂va蜜桃一区二区三区| 精品国产一区二区亚洲人成毛片| 青青草一区二区三区| 亚洲欧洲日韩女同| 中文字幕综合网| 亚洲午夜免费视频| 欧洲一区二区三区免费视频| 欧美日韩亚洲高清一区二区| 777午夜精品视频在线播放| 偷拍一区二区三区四区| 亚洲精品中文字幕乱码三区 | 国产一区二区影院| 懂色av中文一区二区三区| 国产乱人伦精品一区二区在线观看| 91久久人澡人人添人人爽欧美 | 亚洲一区视频在线| 亚洲午夜视频在线| 成人国产一区二区三区精品| 国产夫妻精品视频| 欧美一级淫片007| 亚洲精品成人a在线观看| 欧美国产欧美综合| 三级不卡在线观看| 国产精品第一页第二页第三页| 欧美videos大乳护士334| 色噜噜夜夜夜综合网| 99久久综合国产精品| 亚洲黄色免费网站| 伊人色综合久久天天人手人婷| 中文字幕一区在线观看视频| 91国在线观看| 欧美日韩aaa| 91免费在线视频观看| 国产精品 日产精品 欧美精品| 日韩成人伦理电影在线观看| 日韩中文字幕91| 色综合天天综合狠狠| 国产高清亚洲一区| 国产精品1024| 成人国产精品视频| gogogo免费视频观看亚洲一| 成人免费精品视频| 91丝袜呻吟高潮美腿白嫩在线观看| 国产精品一二三四| 韩国成人精品a∨在线观看| 成人黄色在线网站| 国产裸体歌舞团一区二区| 精品一区二区精品| 国产精品综合二区| 国产91在线观看| 欧美性淫爽ww久久久久无| 欧美少妇xxx| 欧美一区二区成人| 欧美电影免费观看完整版| 久久亚洲二区三区| 亚洲美女淫视频| 日韩高清不卡一区二区三区| 国产一区二区久久| 7777精品伊人久久久大香线蕉最新版| 在线一区二区三区四区五区| 欧美日韩五月天| 欧美一区二区观看视频| 欧美tk丨vk视频| 国产精品影音先锋| 日本免费新一区视频| 国产一区二区影院| 欧美一区二区三区在线观看视频| 久久亚洲精华国产精华液| av成人动漫在线观看| 欧美一级夜夜爽| 国产成人精品综合在线观看| 色av成人天堂桃色av| 91麻豆swag| 国产视频一区在线播放| 国产精品一区二区果冻传媒| 欧美特级限制片免费在线观看| 天堂av在线一区| 丰满白嫩尤物一区二区| 国产精品电影院| 男女男精品视频| 蜜桃精品视频在线观看| 国产精品77777竹菊影视小说| 美女视频免费一区| 蜜臀av性久久久久蜜臀aⅴ| 天堂av在线一区| 欧美日韩大陆一区二区| 欧美日本一道本在线视频| 中文字幕人成不卡一区| 一区二区在线免费| 在线一区二区观看| 日韩视频中午一区| 老司机午夜精品99久久| 中文字幕欧美三区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲精品在线观| 五月天中文字幕一区二区| 午夜精品一区二区三区电影天堂 | 色悠悠久久综合| 国产精品素人一区二区| 一区二区三区中文字幕在线观看| 国产精品自拍在线| 91免费版在线| 中文字幕精品一区二区三区精品| 亚洲欧美在线另类| 在线免费视频一区二区| 678五月天丁香亚洲综合网| 日韩精品视频网| 国产不卡视频在线播放| 亚洲国产成人午夜在线一区| 夜夜夜精品看看| 911精品国产一区二区在线| 欧美日韩精品一区二区三区四区 | 亚洲成人手机在线| 日韩三级伦理片妻子的秘密按摩| 久久久久久久久久久黄色| 97精品久久久午夜一区二区三区 | www.欧美.com| 91麻豆精品国产91久久久更新时间 | 国产福利一区在线| 成人精品视频一区二区三区| 欧美精品在线视频| 国产欧美日韩在线| 欧美日韩精品一区二区三区| 日本一区二区电影| 日韩福利电影在线观看| jizzjizzjizz欧美| 欧美日韩综合一区| 国产一区啦啦啦在线观看| 欧美在线免费播放| 日韩一区日韩二区| 国产精品伦理在线| 韩国精品在线观看| 午夜精品久久久久久久久久| 夜夜嗨av一区二区三区| 午夜精品久久一牛影视| 色偷偷久久人人79超碰人人澡| 久久久av毛片精品| 蜜桃91丨九色丨蝌蚪91桃色| 国产综合久久久久久久久久久久| 亚洲欧美乱综合| 99久久精品免费看| 亚洲欧美另类综合偷拍| 波波电影院一区二区三区| 国产偷v国产偷v亚洲高清| 国产欧美一区二区精品忘忧草|