以下是我打算做的一个例子。我有输入数据,如下所示:
data = array([0,1,2,3,4,5,6,7,8,9])
我需要做的是总结前两个值,然后是下两个值,依此类推。所以结果如下:
result = array([1,5,9,13,17])
这就是我所说的'挤压'
我有一个大小为4096的numpy数组。我需要将数组压缩到2048,1024或512的大小。 它实际上是能谱,其中阵列的指数给出ADC通道号。并且该值给出了光子计数。 要做到这一点,我就是这样做的。
# tdspec is input array of size 4096
spec_bin_size = 1024
spect = n.zeros(spec_bin_size)
i = 0
j=0
interval = 4096/spec_bin_size
while j < spec_bin_size:
a = n.sum(tdspec[i:i+interval])
spect[j] = a
i = i+interval
j = j+1
它运作良好,但现在我需要在许多光谱上运行这个循环,我担心它会很慢。 任何人都可以告诉我,如果有一个numpy / scipy操作可以做到这一点吗?
答案 0 :(得分:4)
让我们定义你的数组:
>>> import numpy as np
>>> data = np.array([0,1,2,3,4,5,6,7,8,9])
为了得到你想要的东西:
>>> np.sum(data.reshape(5, 2), axis=1)
array([ 1, 5, 9, 13, 17])
或者,如果我们想要重塑为我们计算其中一个维度,请为该维度指定-1
:
>>> np.sum(data.reshape(-1, 2), axis=1)
array([ 1, 5, 9, 13, 17])
>>> np.sum(data.reshape(5, -1), axis=1)
array([ 1, 5, 9, 13, 17])
Scipy有各种各样的可用。要模拟上面的过滤器,例如:
>>> import scipy.ndimage.filters as filters
>>> filters.convolve1d(data, [1,1])
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 18])
或者,只需选择所有其他元素即可获得之前的结果:
>>> filters.convolve1d(data, [1,1])[::2]
array([ 1, 5, 9, 13, 17])
有关其他过滤器,请参阅scipy.ndimage.filters。
您使用的大礼帽过滤器可能会导致虚假伪影。高斯滤波器通常是更好的选择。