使用Mathematica过滤实际值

时间:2014-05-04 14:13:25

标签: filter wolfram-mathematica

我正在处理相当大的矩阵,我想过滤掉真正的价值。

{999, "na", Times[w, 1], 2.5, Indeterminate, 6.0}

应该成为

{"na", "na", "na", 2.5, "na", 6.0}

适用于

AnyMatrix /. {_If -> "na", _Last -> "na", _Mean -> "na", _Plus -> 
   "na", _Round -> "na", _Times -> "na", _Integer -> 
   "na", _DirectedInfinity -> "na", Indeterminate -> "na"}

但这可能不是非常节省时间。另外,我无法预测到什么 其他非真实形式将在未来出现。

有更聪明的方法吗?

2 个答案:

答案 0 :(得分:0)

这应该是有效的:

lst = {999, "na", Times[w, 1], 2.5, Indeterminate, 6.0};
pos = Position[lst, _Real];
ReplacePart[ConstantArray["na", Length[lst]], 
 Thread[Rule[Flatten[pos], Extract[lst, pos]]]]

(*=> {"na", "na", "na", 2.5, "na", 6.} *)

效率更高:

lst = {999, "na", Times[w, 1], 2.5, Indeterminate, 6.0};
pos = Position[lst, _Real];
SparseArray[Thread[Rule[Flatten[pos], Extract[lst, pos]]], 
  Length[lst], "na"] // Normal

(*=> {"na", "na", "na", 2.5, "na", 6.} *)

另一个简化版本(比以前的尝试更安全,也非常有效):

lst = {999, "na", Times[w, 1], 2.5, Indeterminate, 6.0};
Replace[lst, {x_Real :> x, x_ -> "na"}, {1}]

(*=> {"na", "na", "na", 2.5, "na", 6.} *)

答案 1 :(得分:0)

文档中心教程查找与模式匹配的表达式描述了识别和选择列表元素的几种方法。

案例是一个候选函数,它以最简单的形式挑选并返回与模式匹配的列表元素,这里是Real。

lst = {999, "na", Times[w, 1], 2.5, Indeterminate, 6.0};
Cases[lst,s_Real]

(* Out-> {2.5,6.} *)

但是如果你想保留数据的原始结构,那么你将需要对每个元素进行分类,如果它符合则保留它,如果它没有,则替换它。您可以通过向Cases参数列表提供替换规则来实现此目的,这些规则可以通过模式,条件和计算以通常的方式构建。以下是一种透明的方式来制定产生所需结果的替换规则。

Cases[lst, s_ :> If[Head[s] === Real, s, "na"]]

(* Out -> {"na", "na", "na", 2.5, "na", 6.} *)

默认情况下,Cases作用于列表的顶层 - 在这种情况下适用 - 但对于更复杂的数据结构,可以通常的方式指定级别活动。