如何在Julia中消除数组(1D)中的零元素?
我想知道如何才能消除Julia数组(1D)中的元素,就像下面的一样。它是通过读取一个文本文件构建的,文本文件中的行没有相关信息,而行中有相关信息。“nothing”是Void类型,我想清除数组中的所有内容如何在Julia中消除数组(1D)中的零元素?,julia,Julia,我想知道如何才能消除Julia数组(1D)中的元素,就像下面的一样。它是通过读取一个文本文件构建的,文本文件中的行没有相关信息,而行中有相关信息。“nothing”是Void类型,我想清除数组中的所有内容 nothing nothing
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ó。我的第一个想法是阅读所有/检查/写正确的行。在我看来,你的建议和我的建议产生了相同的结果(尽管我的建议没有显示写作部分。我对吗?