Python:将函数应用于数组的每个列

4
我需要将一个numpy数组的每一列应用一个函数。我不能对数组的每个元素进行操作,而必须对每个列进行操作,因为每个列合在一起代表了一种信息。
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,我正在对每一列应用一个耗时的函数。
2个回答

7
您可以尝试使用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])

2

使用这种方法似乎只需要花费原来的大约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

你说的更Pythonic是什么意思? - Zanam
这个链接提供了Pythonic的含义描述。基本上,代码更易读和直接。 - Jared Goguen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接