2012-04-04 30 views
4

一種玩具情況我的問題:生成重新映射的numpy數組作爲視圖。

我有大小的numpy的陣列,比如,1000:

import numpy as np 
a = np.arange(1000) 

我也有一個「投影數組」 p其是從的映射一個到另一個陣列b

p = np.random.randint(0,1000,(1000,1000)) 

這是很容易得到b使用「神奇索引」 一個

b = a[p] 

b不是一個視圖,通過前幾次的問題/解答和numpy的文件指出。

不幸的是,在我的情況下,只有在值在較長的模擬過程,並使用花哨的索引在每次迭代變化獲得b變得非常昂貴。我只從b讀取,不要修改它。

我知道這是不可能(還)解決這個花哨的索引。

我想知道是否有人有類似的問題/瓶頸,並提出了一些其他的解決方法?

+1

是否在每次迭代中都訪問了'b'?如果是的話,沒有比提取所有「b」更便宜的方法 - 您可能需要以其他方式改進算法。如果不是,你不需要建立'b',而是訪問'b [i,j]',你可以使用'a [p [i,j]]'。 – 2012-04-04 21:19:29

回答

2

你要求的是不實際的,這就是爲什麼numpy人沒有實現它。你可以用自己喜歡的東西做到這一點:

class FancyView(object): 
    def __init__(self, array, index): 
     self._array = array 
     self._index = index.copy() 
    def __array__(self): 
     return self._array[self._index] 
    def __getitem__(self, index): 
     return self._array[self._index[index]] 

b = FancyView(a, p) 

但要注意的是昂貴的a[p]操作將被調用每次使用b作爲數組的時間。沒有其他的做法可以做出這種「觀點」。 Numpy可以使用基本切片的視圖,因爲它可以操縱步幅,但是沒有辦法使用步幅做這樣的事情。

如果您只需要b的某些部分,您可以通過索引幻想視圖而不是將其用作數組來節省一些時間。

+0

這就是我所擔心的:-)無論如何。 – upperBound 2012-04-05 13:46:50