通过对数组内的点进行平均 (IDL) 来减小数组的大小

Reducing the size of an array by averaging points within the array (IDL)

虽然我确定有答案,而且这个问题很低级(但总是容易让您犯错),但我的主要问题是尝试对问题进行措辞。

假设我有以下数组:

time=[0,1,2,3,4,5,6,7,8,9,10,11] ;in seconds
data=[0,1,2,3,4,5,6,7,8,9,10,11] 

'time' 数组位于“1s”的容器中,但我希望数组位于“2s”的容器中,其中数据是平均值:

time=[0,2,4,6,8,10] ;in seconds
data=[0.5,2.5,4.5,6.5,8.5,10.5] 

是否有(我确定有)IDL 函数可以在 IDL 中实现它? 我的实际数据数组是:

DATA          DOUBLE    = Array[15286473]

所以我宁愿使用现有的、高效的解决方案,也不愿创建自己的解决方案。

干杯, 保罗

注意:我可以通过插值数据 (INTERPOL) 将时间数组更改为我想要的

IDL> x=[0,1,2,3,4,5,6,7,8,9,10]
IDL> x_new=interpol(x,(n_elements(x)/2)+1.)
IDL> print, x_new                          
      0.00000      2.00000      4.00000      6.00000      8.00000      10.0000

问题仅在于数据数组

我可以想到几种方法来做到这一点,但最简单的方法如下:

nd  = N_ELEMENTS(data)
ind = LINDGEN(nd)
upi = ind[1:(nd - 1L):2]
dni = ind[0:(nd - 1L):2]

其中描述了我使用的索引形式 here。可以将数组写为 ind[s0:s1:n],其中 s0 是起始元素,s1 是结束元素,n 步长.

既然我们有了相邻元素的索引,那么我们可以将向量化格式的平均值定义为:

avg_data = (data[upi] + [dni])/2

您可以做类似于您的时间戳的事情,或者如果您愿意,可以使用 INTERPOL

有更复杂的方法(例如 trapezoid rule)可以做到这一点,但以上是一个快速简单的解决方案。

我认为你需要rebinhttp://www.exelisvis.com/docs/REBIN.html

congrid 提供类似的功能。如果 rebin 不能解决您的问题,这应该有效:

step = 2
select = step * indgen(floor(n_elements/step))
new_time = (smooth(time, step))[select]
new_data = (smooth(data, step))[select]

您可能希望根据您的要求将 /edge_truncate 设置为平滑。还有,国际刑警不会为你工作吗?