2016-11-21 71 views
1

我正在處理大量的數組,並且我想知道是否有辦法使用別名,以便使用數組子集的操作不需要「reslice」數組每次更新全局數組時。別名numpy數組的部分

例如:

values = np.array([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]) 
index = np.array([2, 4, 8, 9]) 
sub_val = values[index] 

這將返回sub_val以下:

sub_val = [300 500 900 1000] 

如果我改變原來的數組:

values += 1 

sub_val仍返回:

sub_val = [300 500 900 1000] 

,而不是所期望的:在此基礎上

sub_val = [301 501 901 1001] 

,我假設所有索引/切片操作創建一個淺表副本。有沒有辦法讓sub_val成爲數組子集的別名?

目標是儘可能有效地做到這一點(子集矩陣用於數千次迭代)。

+0

我想你可以創建自己的slice_view類來獲得該行爲。 – Gonmator

+0

不適用於該索引。查看有關視圖v副本和基本v高級索引的文檔。 – hpaulj

+0

* basic * slicing返回一個視圖,並且應該比* advanced *索引更快 – RomanPerekhrest

回答

0

數組的值存儲在數據緩衝區中,但不能直接訪問該數組。該陣列的索引方法使用它的dtypeshapestrides

A view有它自己的shapestrides,但共享數據緩衝區(可能從緩衝區中的不同位置開始)。因此,它「看到」了對原始作出的改變。

但是,您的「隨機」索引不能用shapestrides表示。所以numpy必須做一個副本 - 一個擁有自己的數據緩衝區的數組(從原始數據複製的值)。該副本不保留任何創建記錄(即不存儲索引)。

建議副本的答案是從原始值複製值並將其複製回來,但這不會節省任何您擔心的交易成本。

我的建議是不用擔心這個索引成本。假設numpy儘可能有效地執行此步驟。重點在於減少那些​​。