如果我有以下数组:
x = double([1, 1, 1, 10, 1, 1, 50, 1, 1, 1 ])
我想做以下事情:
将数组分组为5个组,每个组将分别进行评估。
识别数组
删除该MAX值并将其放入另一个数组中。
最后,我想打印没有MAX值的更新数组x,以及包含MAX值的新数组。
我该怎么做?我是IDL的新手,没有正式的编码培训。
我知道我可以编写代码进行分组并以这种方式找到最大值:
FOR i = 1, (n_elements(x)-4) do begin
print, "MAX of array", MAX( MAX(x[i-1:1+3])
ENDFOR
但是,我如何实现上面指定的所有内容?我知道我必须创建一个空数组,它将追加for循环找到的值,但我不知道该怎么做。
由于
答案 0 :(得分:1)
我改变了你的x
以拥有独特的元素,以确保我不会愚弄自己。这样,x
的元素数量必须可以被group_size
整除:
x = double([1, 2, 3, 10, 4, 5, 50, 6, 7, 8])
group_size = 5
maxes = max(reform(x, group_size, n_elements(x) / group_size), ind, dimension=1)
all = bytarr(n_elements(x))
all[ind] = 1
x_without_maxes = x[where(all eq 0)]
print, maxes
print, x_without_maxes
答案 1 :(得分:0)
List
对此有好处,因为它们允许您在特定索引处弹出值,而不是再次重写整个数组。您可以尝试以下内容。我在这里使用了while
循环,而不是for
循环,因为在这种情况下它会更容易。
x = List(1, 1, 1, 10, 1, 1, 50, 1, 1, 1)
maxValues = List()
pos = 4
while (pos le x.length) do begin
maxValues.add, max(x[pos-4:pos].toArray(), iMax)
x.Remove, iMax+pos-4
pos += 5-1
endwhile
print, "Max Values : ", maxValues.toArray()
print, "Remaining Values : ", x.toArray()
这可以让你做我想你想做的事。最后,您有一个List对象(可以很容易地转换为数组),每个组的最大值为5,另一个包含剩余值。
另外,请将其标记为idl-programming-language
而不是idl
。它们是两个不同的标签。