通过对数组内的点进行平均 (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)可以做到这一点,但以上是一个快速简单的解决方案。
我认为你需要rebin
:http://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 设置为平滑。还有,国际刑警不会为你工作吗?
虽然我确定有答案,而且这个问题很低级(但总是容易让您犯错),但我的主要问题是尝试对问题进行措辞。
假设我有以下数组:
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)可以做到这一点,但以上是一个快速简单的解决方案。
我认为你需要rebin
:http://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 设置为平滑。还有,国际刑警不会为你工作吗?