2011-03-02 40 views
1

我想一次將函數應用於單維數組3個元素,併爲每個元素輸出一個元素。將函數一次應用到3個元素中novey

,比如我有13個元素的數組:

a = np.arange(13)**2 

,我想申請一個功能,讓我們說np.std作爲一個例子。

下面是對應的列表理解:

[np.std(a[i:i+3]) for i in range(0, len(a),3)] 
[1.6996731711975948, 
6.5489609014628334, 
11.440668201153674, 
16.336734339790461, 
0.0] 

沒有人知道使用numpy的功能,更有效的方法?

回答

5

最簡單的方法是重塑它並沿着軸應用函數。

import numpy as np 
a = np.arange(12)**2 
b = a.reshape(4,3) 
print np.std(b, axis=1) 

如果你需要比這更好一點的表現, 你可以嘗試stride_tricks。除了使用stride_tricks之外,其他部分與上面相同。我錯誤地看到了性能增益,因爲如下所示,b與上面的b完全一樣。如果他們編譯成完全相同的東西,我不會感到驚訝。

import numpy as np 
a = np.arange(12)**2 
b = np.lib.stride_tricks.as_strided(a, shape=(4,3), strides=(a.itemsize*3, a.itemsize)) 
print np.std(b, axis=1) 
+0

跨越招數就是我一直在尋找,你就會有這種情況的一個例子?它看起來相當複雜,使用 – 2011-03-02 07:02:26

+0

@Andrea Z:看到我的更新。 「as_strided」允許你做的是同時改變形狀和步幅,從而改變陣列的外觀尺寸。由於在這種情況下你不需要改變步幅或大小,它完全等同於使用'reshape'。請參閱http://stackoverflow.com/questions/4923617/efficient-numpy-2d-array-construction-from-1d-array發佈更多解釋。 – Paul 2011-03-02 08:04:13

+0

,如果您要使用的函數沒有'axis ='參數,請使用[numpy.apply_along_axis](http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html ) – endolith 2012-11-29 03:55:34

0

您可以重塑它。但是這確實需要大小不會改變。如果你能在最後的一些虛假條目釘,你可以這樣做:

[np.std(s) for s in a.reshape(-1,3)] 
+0

你的意思是「如果你能處理一些虛假的條目......」?我認爲'reshape'不可能做到這一點,但用'步伐技巧'很容易出現這種情況。 – eat 2011-03-02 08:41:23

+0

無法重新生成部分行。爲了使它成爲矩形,可能需要添加一些矩形。但在這種情況下步伐更好。 – Keith 2011-03-02 11:30:47

相關問題