2011-11-27 67 views
1

我有一個包含複數的一維numpy數組(例如。numpy.complex64)。我需要在這個數組上創建視圖,但我不知道如何創建一個視圖給定一個列表或索引範圍,以在視圖中包含非連續項目的NumPy數組視圖

>>> myArray = np.ndarray(shape=(1000,), dtype=np.complex64) 

我知道如何創建連續項的視圖,例如第100個元素:

>>> myView = myArray[:100] 

當我嘗試,它不可能建立在單一項目視圖,像myArray的[2]因爲如果我修改了這個值,它不會改變底層數組。這是確定的,但我希望有一種方法來構建由多個任意索引視圖,所以這樣的功能將是巨大的:

>>> myView = createView(myArray, indices=(0, 1, 6, 7, 13)) 

這將返回一個指向列表中給出的索引視圖(或任何可迭代的形式),如果我更改myView,它會改變myArray像它應該。

這是可能的,還是有一個理智的解決方法? 感謝

編輯

要解釋爲什麼我需要這樣的:我想數組OpenCL設備的內存(反面)複製。我需要設備上元素的順序不同於原始數組,而這些較短的數組將被視爲向量,而矩陣乘法將在OpenCL內核中進行。如果元件沒有按要求的順序複製到設備存儲器中,則不可能實現存儲器合併,並且會出現顯着的性能下降,更不用說在OpenCL端需要額外的邏輯了。

在我的情況下,可以用均勻間隔的視圖來做到這一點,但我想知道是否有更一般的方法。如果可以完成更通用的實現,那麼CPU性能下降很小。

+0

這不是真的有可能使一個不​​均勻間隔視圖。但是可以以各種方式使用任意索引列表。你需要什麼? –

+0

實際上我用完原始數組的所有索引一次,並且想要創建具有較短長度的多個數組,並引用原始數組。 (在我的例子中,可以用均勻間隔的視圖來完成,但我想知道是否可以用更一般的方式。)我想將數據複製到OpenCL設備內存,並使用PyOpenCL InOut作爲過濾數組,以更改原始數組中的正確索引。 – tamacun

回答

2

據我所知,你不能看到任意索引;只限於連續的指數或定期間隔的指數。這是因爲視圖底層內存中的元素必須以恆定數量的字節分隔,否則所有快速NumPy例程都不起作用。

+0

我想將「視圖」複製到OpenCL設備,並對數據進行計算,所以在我的情況下,代碼的CPU端不需要進行完美的優化。正如Alexandru所建議的那樣,我會研究過濾器或口罩來達到這個目的。 – tamacun

0

據我所知,在ndarray上的視圖是這樣產生的:myArray.view(dtype)。這裏是文檔:http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html

它不回答你的不連續的項目問題,但我認爲這是一個好的開始。

我認爲你應該用你的索引創建另一個過濾數組。因爲我的觀點並不是真的需要過濾,而是用相同數據的不同表示。

0

下面演示了OP的要求:

>>> a = numpy.array(xrange(103,114)) 
>>> a 
array([103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113]) 
>>> view = numpy.array([2,6,7,9]) 
>>> a[view] 
array([105, 109, 110, 112]) 
>>> a[view] += 9999 
>>> a 
array([ 103, 104, 10104, 106, 107, 108, 10108, 10109, 111, 
     10111, 113])