在numpy中每次对3个元素应用函数

1 投票
3 回答
560 浏览
提问于 2025-04-16 12:48

我想对一个一维数组每次处理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

你可以改变它的形状。但是这需要保持大小不变。如果你可以在最后加上一些虚假的条目,那你就可以这样做:

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

你是在说类似于“向量化”的东西吗? http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

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)

撰写回答