使用Julia非标准数组删除索引

时间:2017-02-02 22:50:34

标签: indexing julia

在我之前写过的答案中:https://stackoverflow.com/a/41966459/2749865我试图使代码足够通用,以处理具有非标准索引的数组。为此,使用构造indices代替1:size(...)

[C[i+1, j]/C[i, j]-1 for i in 1:size(C, 1)-1, j in indices(C, 2)]

正如您所看到的,当我想删除最后一个元素时,我无法弄清楚如何使用indices

我可以通过编写n跳过第一个 drop(indices(C, 1), n)元素,但找不到任何方法来删除最后 n个索引。

我该如何做到这一点?

编辑:只是为了解决这个问题。在我的具体例子中,我可以写

[C[i, j]/C[i-1, j]-1 for i in drop(indices(C, 1), 1), j in indices(C, 2)]

但我仍然有兴趣听听是否有一般解决方案。

2 个答案:

答案 0 :(得分:2)

尝试类似

的内容
[C[i+1, j]/C[i, j]-1 for i in indices(C, 1)[1:end-1], j in indices(C, 2)]

在其他情况下,我使用了像

这样的结构
inds_interior = map(r->first(r)+1:last(r)-1, indices(A))

跳过每个维度的第一个和最后一个元素。

答案 1 :(得分:1)

如果您使用Iterators包:

using Iterators

for i in imap(first,partition(indices(C,1),n+1,1))
  @show i
end

诀窍。具体来说,partition采用长度为n+1的序列,而first只采用第一个元素,而最后一个n+1序列直到索引的末尾都有第一个元素{{1最后一个元素。

但也许一个功能会让事情看起来更好:

n

现在:

Base.chop(itr,n) = imap(first,partition(itr,n+1,1))

julia> chop(1:10,3)|>collect 7-element Array{Any,1}: 1 2 3 4 5 6 7 已经为字符串定义,删除了最后一个字符。似乎语义非常接近,使其适当重载。