1 回答

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}
添加回答
舉報