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

Indexing 使用Julia非标准数组删除索引,indexing,julia,Indexing,Julia,在我之前写的一个回答中:我试图使代码足够通用,以处理具有非标准索引的数组。为此,使用构造索引代替1:size(…): 但是,正如您所看到的,当我想要删除最后一个元素时,我不知道如何使用索引 我可以通过编写drop(索引(C,1),n)跳过第一个n元素,但找不到任何方法删除最后n个索引 我怎样才能做到这一点 编辑:只是为了阻止这一点。在我的具体例子中,我可以写 [C[i, j]/C[i-1, j]-1 for i in drop(indices(C, 1), 1), j in indices(C,

在我之前写的一个回答中:我试图使代码足够通用,以处理具有非标准索引的数组。为此,使用构造
索引
代替
1:size(…)

但是,正如您所看到的,当我想要删除最后一个元素时,我不知道如何使用
索引

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

我怎样才能做到这一点

编辑:只是为了阻止这一点。在我的具体例子中,我可以写

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

但是我仍然很想知道是否有一个通用的解决方案。

如果您使用迭代器包:

using Iterators

for i in imap(first,partition(indices(C,1),n+1,1))
  @show i
end
这就是诀窍。具体地说,
partition
采用长度为
n+1
的序列,并且
first
仅采用第一个元素,并且直到索引末尾的最后一个
n+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
chop
已为字符串定义,删除了最后一个字符。似乎语义非常接近,可以适当地进行重载。

试试类似的方法

[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:size(C,1)-1
替换为
chop(索引(C,1),1)
会使代码慢3个数量级。但它适用于任何迭代器。要使
范围
和已知长度的迭代器获得更好的性能,更好的方法是
获取适当数量的值(
length()-n
)。这需要对
chop
进行修改或另一次重载,最好在笔记本电脑上完成,而不是在我的手机上。请注意,根据,非标准阵列可能没有
length
size
方法。(顺便说一句,在手机上输入编程建议的道具!)这与普通的
1:size(…)
:)性能相似。既然支持非标准数组,您认为这种模式足够普遍了吗?它应该有自己的习惯用法,例如
chop
(如@DanGetz所建议的)?在我的代码中,我当然一直都在做类似的事情。你可能需要
chopfront
chopback
。我可能会被说服,但目前我看不出比
ind[1:end-3]
有什么特别的优势。特别是,目前索引必须是
AbstractVector
s或
AbstractArray
s,因此所有有效的索引都支持这种操作。已经有
drop
,所以我认为
chop
将是这一操作的配套。不过,使用
1:end-1
是一个令人满意的解决方案。
inds_interior = map(r->first(r)+1:last(r)-1, indices(A))