亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過沿一個軸堆疊將兩個 numpy 視圖合并為一個視圖

通過沿一個軸堆疊將兩個 numpy 視圖合并為一個視圖

MMTTMM 2021-10-10 16:08:35
我是不是在概念上沒有掌握某些東西(只有類似的問題),或者為什么沿第一個視圖堆疊多個視圖axis=0不會產生新視圖?問題:多個二維數組,其中單行應該組合成一個新矩陣,這也是一個不增加內存使用的視圖。例子:recs = np.arange(2*2).reshape(2,2)recs2 = np.arange(4,2*2*2).reshape(2,2)print(recs)print(recs2)rv0 = recs[0].view()r2v0 = recs2[0].view()#now combinemview = np.stack([rv0,r2v0], axis=0)print(mview)np.may_share_memory(mview,recs2)印刷[[0 1] [2 3]][[4 5] [6 7]][[0 1] [4 5]]False #sure a copy是因為二維數組是單獨的內存區域,結果數組不允許切片等嗎?
查看完整描述

1 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

All concatenate(stack只是另一種調用方式) 創建一個帶有自己的數據緩沖區的數組。它永遠不是view原始的。


您rv0是一個np.ndarray類似的數組 ( ) recs,具有自己的形狀、數據類型和步幅。它只是與recs. 它可以被描述為 的“視圖” recs,但除此之外,它的使用方式與任何其他數組一樣。它沒有特別標記為view類或對象。


In [409]: recs = np.arange(2*2).reshape(2,2)

     ...: recs2 = np.arange(4,2*2*2).reshape(2,2)

由于recs它生成reshape的數組arange的 a 也是“視圖”。這可以通過以下方式變得更加明顯:


temp = np.arange(2*2)

recs = temp.reshape(2,2)

np.may_share_memory(temp, recs)

可以這么說,我們可以獲得數據緩沖區的快照ravel()(僅生成一維視圖):


In [411]: recs.ravel()

Out[411]: array([0, 1, 2, 3])

In [412]: recs2.ravel()

Out[412]: array([4, 5, 6, 7])

現在看看stack:


In [414]: mview = np.stack([recs,recs2], axis=0)

In [415]: mview

Out[415]: 

array([[[0, 1],

        [2, 3]],


       [[4, 5],

        [6, 7]]])

In [416]: mview.ravel()

Out[416]: array([0, 1, 2, 3, 4, 5, 6, 7])

該ravel的mview不是一個子集Out[411]和Out[412]。 mview必須有自己的連續數據緩沖區。沒有機制可以創建與 2 個或更多其他數組共享內存的數組(除非它們也共享內存)。


即使是stack由同一數組的切片制成的,也有自己的數據緩沖區:


In [420]: x = np.stack((recs[0],recs[1]))

In [421]: x

Out[421]: 

array([[0, 1],

       [2, 3]])

In [422]: np.may_share_memory(recs, x)

Out[422]: False

我喜歡用來__array_interface__檢查數據緩沖區位置(其他定義屬性):


In [423]: recs.__array_interface__

Out[423]: 

{'data': (37584304, False),

 'strides': None,

 'descr': [('', '<i8')],

 'typestr': '<i8',

 'shape': (2, 2),

 'version': 3}


In [424]: x.__array_interface__

Out[424]: 

{'data': (37614336, False),

 'strides': None,

 'descr': [('', '<i8')],

 'typestr': '<i8',

 'shape': (2, 2),

 'version': 3}


查看完整回答
反對 回復 2021-10-10
  • 1 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號