Julia似乎有很多类似Matlab的功能。我想使用谓词从数组中进行选择。在Matlab中,我可以这样做:
>> a = 2:7 ;
>> a > 4
ans =
0 0 0 1 1 1
>> a(a>4)
ans =
5 6 7
我在朱莉娅找到了一种笨重的看似方式来做部分工作:
julia> a = 2:7
2:7
julia> [int(x > 3) for x in a]
6-element Array{Any,1}:
0
0
1
1
1
1
(使用维基百科称之为list comprehension)。我还没弄明白如何应用这样的套装来选择朱莉娅,但可能会咆哮错误的树。如何从Julia中的数组中进行谓词选择?
答案 0 :(得分:27)
如果使用点.
进行elementwise比较,则可以使用类似Matlab的语法:
julia> a = 2:7
2:7
julia> a .> 4
6-element BitArray{1}:
false
false
false
true
true
true
julia> a[a .> 4]
3-element Array{Int32,1}:
5
6
7
或者,如果您想要更具功能性的谓词方法,可以调用filter
:
julia> filter(x -> x > 4, a)
3-element Array{Int32,1}:
5
6
7
答案 1 :(得分:12)
Julia中的数组理解比Haskell或Python中的列表理解更原始。有两种解决方案 - 您可以使用更高阶的过滤功能,也可以使用广播操作。
filter(x -> x > 4, a)
这会使用谓词filter
调用x -> x > 4
函数(请参阅Julia手册中的匿名函数)。
a[Bool[a[i] > 4 for i = 1:length(a)]]
这将在a
和4的元素之间执行广播比较,然后使用生成的布尔数组来索引a
。它可以使用广播运营商更紧凑地编写:
a[a .> 4]
答案 2 :(得分:4)
我当前正在使用Julia 1.3.1,与先前的答案相比,某些语法已更改。要在多个条件下过滤数组,我必须做:
x = range(0,1,length=100)
x[(x .> 0.4) .& (x .< 0.51)]
请注意执行AND运算符所需的'。&'。
答案 3 :(得分:0)
要过滤字典中的键,这对我有用:
mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
filter(x -> occursin("part of a string", string(x)), keys(mydict))
这是Julia 1.0中REPL上的输出结果
julia> mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
Dict{String,Float64} with 3 entries:
"key2" => 2.0
"key1" => 1.0
"a big string with a part of a string" => 3.0
julia> filter(x -> occursin("part of a string", string(x)), keys(mydict))
Set(["a big string with a part of a string"])
通常,这是过滤字符串数组的好方法。
希望有帮助。
答案 4 :(得分:0)
我想补充一个以前的答案没有涉及的方面。如果您想通过索引值(而不是数组值)过滤数组,您可以通过 <table>
<tr>
<td></td>
<td>Heading</td>
<td>Heading 2</td>
</tr>
<tr>
<td rowspan="8" class="rowspan">Some Data</td>
<td>546</td>
<td>X</td>
</tr>
<tr>
<td>546</td>
<td></td>
</tr>
<tr>
<td>546</td>
<td>X</td>
</tr>
<tr>
<td>546</td>
<td></td>
</tr>
<tr>
<td>546</td>
<td>X</td>
</tr>
<tr>
<td>546</td>
<td></td>
</tr>
<tr>
<td>546</td>
<td></td>
</tr>
<tr>
<td>546</td>
<td></td>
</tr>
<tr>
<td rowspan="8" class="rowspan">Other Data</td>
<td>123</td>
<td>Y</td>
</tr>
<tr>
<td>123</td>
<td></td>
</tr>
<tr>
<td>123</td>
<td>Y</td>
</tr>
<tr>
<td>123</td>
<td></td>
</tr>
<tr>
<td>123</td>
<td>Y</td>
</tr>
<tr>
<td>123</td>
<td></td>
</tr>
<tr>
<td>123</td>
<td></td>
</tr>
<tr>
<td>123</td>
<td></td>
</tr>
</table>
来实现,其中您将广播运算符应用于索引值而不是点。例如。为了删除你会写的第三个元素
a[1:end ...]