挤压一个numpy阵列

时间:2016-08-23 05:52:35

标签: numpy scipy binning

以下是我打算做的一个例子。我有输入数据,如下所示:

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操作可以做到这一点吗?

1 个答案:

答案 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

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

您使用的大礼帽过滤器可能会导致虚假伪影。高斯滤波器通常是更好的选择。