根据特定条件从Mathematica数组中删除数据点

时间:2012-11-09 19:14:12

标签: wolfram-mathematica

我有一系列由等分点定义的行:

{{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156,0.}},
 {{398.028, 681.}, {420.73, 0.}}, {{0, 681.}, {239.46, 0.}},
 {{175.78, 681.}, {190.651, 0.}}}

我想删除第一个x点等于零的行。试过这样的事情:

 For[i = Length[lines], i > 0, i--, 
 If [lines[[i]][[1]][[1]] = 0, Delete[lines, i], 0]]

......但它不起作用。救命啊!

2 个答案:

答案 0 :(得分:2)

mylist = {{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156,0.}},
 {{398.028, 681.}, {420.73, 0.}}, {{0, 681.}, {239.46, 0.}},
 {{175.78, 681.}, {190.651, 0.}}};

然后

mylist /. {{0, _}, {_, _}} -> Sequence[]

返回

{{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156, 
   0.}}, {{398.028, 681.}, {420.73, 0.}}, {{175.78, 681.}, {190.651, 
   0.}}}

如果你想覆盖现有的定义,你可以写

 mylist = mylist /. {{0, _}, {_, _}} -> Sequence[]

如果您发现自己在Mathematica中编写循环,特别是对于简单的操作,您几乎肯定不会有效地使用该语言。尝试尽可能多地忘记C(或您最熟悉的任何命令式编程语言)。

答案 1 :(得分:0)

Delete没有触及原始论点。 Mathematica是功能风格的,因此对象大多是不可变的。 Delete返回修改后的列表,因此您应该

lines=Delete[lines,i]

你也忘了=是分配,而不是比较。因此,使用==进行比较,最终代码为

For[
 i = Length[lines], i > 0, i--,
 If[
  lines[[i]][[1]][[1]] == 0, lines = Delete[lines, i]
  ]
 ]