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))