在numpy中一次将函数应用于3个元素

时间:2011-03-02 06:01:09

标签: python numpy

我想一次将一个函数应用于一维数组3个元素,并为每个元素输出一个元素。

例如,我有一个包含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函数的更有效方法?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

你在谈论像矢量化这样的东西吗? http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

答案 2 :(得分:0)

你可以重塑它。但这确实要求尺寸不变。如果您可以在最后处理一些虚假条目,您可以这样做:

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