首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在给定2级元素的值的情况下,如何有条件地从嵌套列表的1级删除元素?

在给定2级元素的值的情况下,如何有条件地从嵌套列表的1级删除元素?
EN

Stack Overflow用户
提问于 2020-06-13 03:19:49
回答 1查看 49关注 0票数 2

平台: Mathematica

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

{{轨迹,帧,x,y},{1,0,158.22,11.519},{1,1,159.132,11.637},... {6649,1439,148.35,316.144}}

在表格格式中,它将如下所示:

代码语言:javascript
运行
复制
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的所有行。

我是个数学新手,我甚至不知道从哪里开始。我想也许可以创建一个包含Count[]值小于阈值的轨迹编号的列表,然后使用DeleteCases[]之类的东西有条件地删除遵循该模式的任何元素,但由于我有限的语法知识,我不能走得很远。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 03:45:20

代码语言:javascript
运行
复制
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]

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

代码语言:javascript
运行
复制
discard = Position[table[[All, 1]], _?(MemberQ[under, #] &)];
newtable = Delete[table, discard]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62351060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档