使用Mathematica中的Position进行高效编码

时间:2013-08-01 15:28:30

标签: wolfram-mathematica

我希望有人能够向我展示一种在mathematica中编写代码的更有效方法。

我有一个表有一段(绝对)次的表,第二列包含一个字符串,该字符串与同一行上的时间和下面一行上的时间之间的时间段相关联。这些时间都是有规律的间隔。我还有第二个不规则时间列表,我想要一个与该时间段相关的字符串列表。

我使用此代码完成了它:

regulartime={{1800,a},{3600,b},{5400,b}}  
irregtime={2054,2817,3060,4594, 5123}


flooredtimes=Floor[irregtime,1800]  
position=Table[Position[regulartime,flooredtimes[[i]]],{i,Length[flooredtimes]}]  
lastlist=Table[regulartime[[position[[i,1,1]],2]],{i,Length[flooredtimes]}]  

这会输出一个列表{a,a,a,b,b}然后我可以将其与不规则时间列表结合起来。我的问题是我试图长时间(~500 000)列表并且需要很长时间,是否有更好的方法来做到这一点?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这里有两个想法..

Function[ ireg, 
      Last@Last@
            Select[regulartime, #[[1]] == Floor[ireg, 1800] &]] /@ irregtime


(*{a, a, a, b, b}*)



Last@regulartime[[Floor[#, 1800]/1800]] & /@ irregtime

(*{a, a, a, b, b}*)

答案 1 :(得分:0)

以下是乔治第二种方法的变体:

regulartime[[Quotient[#, 1800], 2]] & /@ irregtime
{a, a, a, b, b}

请注意,您将收到值小于1800的错误;您可能想要单独处理:

time[x_ /; x >= 1800] := regulartime[[Quotient[x, 1800], 2]]
time[else_] := Missing[]

time /@ {356, 3060, 4594}
{Missing[], a, b}