在numpy中每次对3个元素应用函数
我想对一个一维数组每次处理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)