如何在Julia中消除数组(1D)中的零元素?

如何在Julia中消除数组(1D)中的零元素?,julia,Julia,我想知道如何才能消除Julia数组(1D)中的元素,就像下面的一样。它是通过读取一个文本文件构建的,文本文件中的行没有相关信息,而行中有相关信息。“nothing”是Void类型,我想清除数组中的所有内容 nothing nothing

我想知道如何才能消除Julia数组(1D)中的元素,就像下面的一样。它是通过读取一个文本文件构建的,文本文件中的行没有相关信息,而行中有相关信息。“nothing”是Void类型,我想清除数组中的所有内容

nothing                                                                                                                                 
nothing                                                                                                                                 
nothing                                                                                                                                 
nothing                                                                                                                                 
nothing                                                                                                                                 
"   -16.3651\t     0.1678\t    -4.6997\t   -14.0152\t    -2.6855\t   -16.0294\t    -7.8049\t   -27.1912\t    -5.0354\t   -14.5187\t\r\n"
"   -16.4490\t    -1.0910\t    -3.6087\t   -12.6724\t    -1.5945\t   -14.7705\t    -7.2174\t   -25.2609\t    -3.7766\t   -14.3509\t\r\n"
"   -16.4490\t    -2.2659\t    -2.4338\t   -10.9100\t    -0.5875\t   -13.6795\t    -6.7139\t   -22.9950\t    -2.9373\t   -14.0991\t\r\n"

一个简单的方法是使用
过滤器函数以如下方式更新向量:

testvector=[fill(nothing,10) ; [1,2,3]];
# =>13-element Array{Any,1}:
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    1
#    2
#    3

filter!(x->x!=nothing, testvector)
# => 3-element Array{Any,1}:
#     1
#     2
#     3
谢谢@Daniel Arndt

编辑,参考Julia doc中的本段:

nothing
是一个特殊值,它不会在当前位置打印任何内容 交互式提示。除了不打印,这是完全正常的 值,您可以通过编程方式对其进行测试。

我认为下面的所有条件都会使我们达到相同的结果

x!=nothing
x!==nothing
!is(x,nothing)
!isa(x,Void)
typeof(x)!=Void 

你怎么看那个文件的

您可以从数组中筛选出
nothing
s:

filter(x->!is(nothing,x),[nothing,42])#=>Any[42]
但您可能希望首先使用tsv(制表符分隔值)文件清理数据,如下所示:

testvector=[fill(nothing,10) ; [1,2,3]];
# =>13-element Array{Any,1}:
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    nothing
#    1
#    2
#    3

filter!(x->x!=nothing, testvector)
# => 3-element Array{Any,1}:
#     1
#     2
#     3
-16.3651-0.1678-4.6997-14.0152-2.6855-16.0294-7.8049-27.1912-5.0354-14.5187
-16.4490    -1.0910 -3.6087 -12.6724    -1.5945 -14.7705    -7.2174 -25.2609    -3.7766 -14.3509
-16.4490    -2.2659 -2.4338 -10.9100    -0.5875 -13.6795    -6.7139 -22.9950    -2.9373 -14.0991
使用
readdlm

julia>readdlm(“data.tsv”)
3x10数组{Float64,2}:
-16.3651   0.1678  -4.6997  -14.0152  …  -27.1912  -5.0354  -14.5187
-16.449   -1.091   -3.6087  -12.6724     -25.2609  -3.7766  -14.3509
-16.449   -2.2659  -2.4338  -10.91       -22.995   -2.9373  -14.0991
使用
DataFrmaes.readtable

julia>df=readtable(“data.tsv”);
朱莉娅>名字!(df,[A'中x的符号(x):'J'])
2x10数据帧。数据帧
|A | B | C | D | E | F | G行|
|-----|---------|---------|---------|----------|---------|----------|---------|
| 1   | -16.449 | -1.091  | -3.6087 | -12.6724 | -1.5945 | -14.7705 | -7.2174 |
| 2   | -16.449 | -2.2659 | -2.4338 | -10.91   | -0.5875 | -13.6795 | -6.7139 |
|第| H | I | J排|
|-----|----------|---------|----------|
| 1   | -25.2609 | -3.7766 | -14.3509 |
| 2   | -22.995  | -2.9373 | -14.0991 |

testvector[testvector.!=nothing]
也是一个非常可读的选项

基准测试有助于选择最有效的代码。

亲爱的各位

最后,代码变成了这样:

tmpFile=open(fileName)
tmp=readdlm(tmpFile);
ind=pmap(typeof,tmp[:,1]).!=SubString{ASCIIString}; # if the first column typeof is string, than pmap will return false, else, it return true. This will provide an index of valid/not valid rows.
tmpClean=tmp[ind,:]; # only valid rows will be used

如果您有任何改进的建议,我将不胜感激。谢谢您的帮助。

使用typeof函数比使用
过滤器有什么好处吗!(x->x!=无,testvector)
?@DanielArndt您应该使用
==它检查类型。使用lambda有一个轻微的性能问题,但我不值得担心。在这里,为了消除一个元素,使用
Void
类型就足够了,所以这是最小的条件,可能更有效,但在我的选项
x=没有什么比这更简单、更具体。请注意,生成的数组类型是
Any
,您可能希望
Int[filter!(x->x!=nothing,testvector)]
,但显然他们认为他读取数据的方式是错误的。感谢大家的评论和帮助。我正在与Julia一起试验,以提高R的性能。可能会犯很多错误,但学到了很多。添加更多信息时,该文件是一个混合行大小的文本文件(.dat)——有些短(不相关),有些长(包含相关数据)。作为TSV读取可能不起作用,因为尺寸线不是恒定的。我的假设是错误的吗?正如@Ismael所提到的,如果您试图读取一个选项卡式分离的数据矩阵,请首先清理数据(使用notepad++之类的文本编辑器),然后使用
readdlm
将其加载到matrix@RezaAfzalan:谢谢你的评论。关键是我有100多个文件要读,每个文件都有35k多行,行大小不一(相关行与小长度行(无关))混合在一起。以前编辑每个文件对我来说似乎不太现实。谢谢@Ismael。当然,将文件作为TSV读取会更好,但行大小(和数据)并不一致,因此某些行的数据量会比其他行少。它能与readtable或readdlm一起工作吗?我已经尝试过了,它读取TSV文件,在“缺失”值中添加“”(对我来说是新的)。我去掉了几乎所有不相关的台词。正在尝试消除非数字线。有什么提示吗?一种方法是,对于数组
v
[typeof(x)@rgrnorm,我强烈建议您使用一些方法,例如,因为数据准备过程特别耗时。这些文件是如何生成的?只进行一次验证(读取无效文件、验证、写入验证文件)不是更好吗,而不是每次加载数据?谢谢@Ismaelvengacastelló。我的第一个想法是阅读所有/检查/写正确的行。在我看来,你的建议和我的建议产生了相同的结果(尽管我的建议没有显示写作部分。我对吗?