Julia中如何选择数组/矩阵中除一个元素外的所有元素?

18
我想知道在julia数组中是否有可能选择除一个元素之外的全部元素(按索引)。
例如,在R语言中,为了不选择矩阵中的特定行,可以这样写:
a = matrix(1:9, 3, 3)
a
1 4 7
2 5 8
3 6 9

然后:

a[-2, ]
1 4 7
3 6 9

现在我想在Julia中做同样的事情。我尝试使用逻辑运算符,但我找不到选择或取消选择特定索引的方法。这是我尝试过的:

a = rand(3,3)
a[.!= 2, :]
ERROR: syntax "!=" is not a unary operator

或者在R中:

a[-2, :]

还有一些其他的选项。在Julia中有效的是以下内容:

a[a .>= .5, :] 

或者
a[[2,3], :]

选择第二和第三行。无论如何,我真的很想知道如何在julia数组中选择除特定元素(例如行)之外的所有元素。

2个回答

23

这里有一个选择:

A = rand(3,3)
B = A[1:end .!= 2,:]

1:end 得到完整的行索引列表(您也可以使用 1:size(A,1)),然后使用 .!= (注意 . 表示逐元素比较)选择不等于2的索引。

如果您想以这种方式选择列,则可以使用:

C = A[:, 1:end .!= 2]
请注意,end 关键字会自动等于您正在引用的行、列或其他维度的最后一个索引值。 注意:答案已更新以反映@Matt B在评论中提出的改进(使用 end 而不是 size())。

1
这让我的生活变得轻松了许多。现在我可以避免编写丑陋的嵌套for循环。 - Vincent
2
更有趣的是:您可以像这样使用“end”表达式:A[1:end .!= 2, :]。从语义上讲,它完全相同 - 解析器只是处理为您找出正确的“size”调用。 - mbauman
我想这已经足够好了。不过我认为这应该在基础中实现。 - Vincent
2
这已经被讨论作为一个潜在的候选项目,以便纳入基础功能中:https://github.com/JuliaLang/julia/issues/1032。 它不难实现,并且可以先在一个软件包中进行开发。据我所知,目前还没有人花时间去做这件事。 - mbauman
感谢@TasosPapastylianou。我最多只能说自己有点回来了。虽然偶尔会回答一些问题,但这些日子我可能不会回答太多问题。希望你和你的论文一切顺利! - Michael Ohlrogge
显示剩余3条评论

5
你应该使用 Not 函数,它构造了一个反向索引:
A = rand(3,3)
A[Not(2), :]
A[:, Not(2)]

您可以在InvertedIndices.jl包中找到Not函数。


1
谢谢分享,我一直在寻找这个!请注意,它也可以用于排除多个索引,例如 Not([2,5,10]) 将排除所有这些条目。 - linx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接