【问题标题】:How can I conditionally remove elements from level 1 of a nested list given the value of a level 2 element?给定 2 级元素的值,如何有条件地从嵌套列表的 1 级删除元素?
【发布时间】:2020-10-02 16:06:54
【问题描述】:

平台:数学

我有一个属于各个连接路径(轨迹)的 x 和 y 坐标表:

{{Trajectory, Frame, x, y}, {1, 0, 158.22, 11.519}, {1, 1, 159.132, 11.637}, ... {6649, 1439, 148.35, 316.144}}

表格格式如下:

Trajectory     Frame     x        y
------------------------------------------
1              0         158.22   11.519
1              1         159.13   11.637
1              2         158.507  11.68
1              3         157.971  11.436
1              4         158.435  11.366
1              5         158.626  11.576
2              0         141      12       remove this row, path too short!
2              1         143      15       remove this row, path too short!
2              2         144      16       remove this row, path too short!
2              3         147      18       remove this row, path too short!
3              0         120      400
3              1         121      401
3              2         121      396
3              3         122      394
3              4         121      392
3              5         120      390
3              6         124      388
3              7         125      379
...

我想删除轨迹总长度小于“n”帧/行/元素(本例为 5 帧)的任何元素/行。该列表的元素长度约为 80k,我想删除所有包含指定阈值以下轨迹的行。

对于给定的示例,轨迹 2 仅存在 4 帧,因此我想删除轨迹 2 的所有行。

我是 Mathematica 的新手,我什至不知道从哪里开始。我想可能会创建一个列表,其中包含Count[] 值小于阈值的轨迹编号,然后有条件地使用DeleteCases[] 之类的东西消除遵循该模式的任何元素,但我无法给出很远我有限的语法知识。

感谢您的帮助并期待解决方案!

【问题讨论】:

    标签: optimization nested coordinates wolfram-mathematica delete-row


    【解决方案1】:
    table = {{"Trajectory", "Frame", "x", "y"},
       {1, 0, 158.22, 11.519}, {1, 1, 159.13, 11.637},
       {1, 2, 158.507, 11.68}, {1, 3, 157.971, 11.436},
       {1, 4, 158.435, 11.366}, {1, 5, 158.626, 11.576},
       {2, 0, 141, 12}, {2, 1, 143, 15}, {2, 2, 144, 16},
       {2, 3, 147, 18}, {3, 0, 120, 400}, {3, 1, 121, 401},
       {3, 2, 121, 396}, {3, 3, 122, 394}, {3, 4, 121, 392},
       {3, 5, 120, 390}, {3, 6, 124, 388}, {3, 7, 125, 379}};
    
    traj = First /@ Rest[table];
    n = 5;
    under = First /@ Select[Tally[traj], Last[#] < n &];
    discard = Flatten[Position[table[[All, 1]], #] & /@ under];
    newtable = Delete[table, List /@ discard]
    

    或者,对于最后两行,这可能会更快

    discard = Position[table[[All, 1]], _?(MemberQ[under, #] &)];
    newtable = Delete[table, discard]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-13
      • 2014-05-06
      • 2017-12-15
      • 1970-01-01
      • 2017-06-03
      • 2019-07-13
      • 2012-11-07
      • 2021-07-17
      相关资源
      最近更新 更多