在我之前写过的答案中: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)]
但我仍然有兴趣听听是否有一般解决方案。
答案 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
已经为字符串定义,删除了最后一个字符。似乎语义非常接近,使其适当重载。