2016-01-21 101 views
1

我需要將函數應用於numpy數組的每一列。我無法爲數組的每個元素執行此操作,但它必須是每列,因爲每列組合在一起表示一個信息。Python:將函數應用到數組的每一列

import numpy as np 
C = np.random.normal(0, 1, (500, 30)) 

這是要做到這一點(爲了說明我使用np.sum)的最有效的方式:

C2 = [ np.sum(C[ :, i ]) for i in range(0, 30) ] 

陣列C是500x4000,我施加耗時函數到每個列以及。

回答

1

這似乎採取的〜75%的時間,而不是使用:

[ np.sum(row) for row in C.T ] 

,也是更Python。作爲參考,這些是timeit結果。

>>> timeit('[ np.sum(C[ :, i ]) for i in range(0, 30) ]', 
    setup='import numpy as np; C = np.random.normal(0, 1, (500, 30))', number=1000) 
0.418906474798 
>>> print timeit('[ np.sum(row) for row in C.T ]', 
    setup='import numpy as np; C = np.random.normal(0, 1, (500, 30))', number=1000) 
0.345153254432 
>>> print timeit('np.apply_along_axis(np.sum, 0, C)', 
    setup='import numpy as np; C = np.random.normal(0, 1, (500, 30))', number=1000) 
0.732931300891 
+0

你是什麼意思更Pythonic? – Zanam

+0

[此鏈接](http://blog.startifact.com/posts/older/what-is-pythonic.html)給出了Pythonic的含義。基本上,代碼更具可讀性和直接性。 –

3

您可以嘗試np.apply_along_axis

In [21]: A = np.array([[1,2,3],[4,5,6]]) 

In [22]: A 
Out[22]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

In [23]: np.apply_along_axis(np.sum, 0, A) 
Out[23]: array([5, 7, 9]) 

In [24]: np.apply_along_axis(np.sum, 1, A) 
Out[24]: array([ 6, 15]) 
相關問題