将 Mathematica 值列表转换为布尔列表
Posted
技术标签:
【中文标题】将 Mathematica 值列表转换为布尔列表【英文标题】:Converting Mathematica list of values into boolean list 【发布时间】:2011-12-22 19:54:47 【问题描述】:首先,很抱歉标题混乱。
我想做的是将1, 4, 9
转换为:
True, False, False, True, False, False, False, False, True
也就是说,只有第一个列表中的索引的值为True
,其余的为False
。
我感觉有一些非常简单的解决方案,但我对 Mathematica 和函数式编程都很陌生。我可以在一个循环中迭代地完成它,但必须有一些东西可以与整个列表一起使用。正确的? :)
感谢您的帮助。
编辑:表明我在问之前尝试做某事,这是我到目前为止的进展:
first=1,4,9
ReplacePart[Table[False, x, Max[first]], 1 -> True]
(* gives True, False, False, False, False, False, False, False, False *)
不幸的是,它不适用于1,4,9 -> True
,但可以用于1 -> True, 4 -> True, 9 -> True
。但我不知道该怎么做......
编辑 2: 明白了。
ReplacePart[Table[False, x, Max[first]], Table[x -> True, x, first]]
我仍然希望看到您的解决方案!这对我来说似乎是一个丑陋的黑客...... :)
【问题讨论】:
【参考方案1】:我将使用SparseArray
进行此操作。在我看来,它很容易理解,而且效率也很高,尤其是在低百分比的索引为 True 时。
true = 1, 4, 9;
SparseArray[(List /@ true) -> True, Automatic, False]
或者使用Transpose
(粘贴到Mathematica时看起来更好):
SparseArray[true\[Transpose] -> True, Automatic, False]
如果您必须将输出转换为普通数组,您可以使用Normal
,但大多数操作不需要。
另外,为了简洁而牺牲实用性:
#==1 & /@ SparseArray[List /@ true -> 1]
【讨论】:
【参考方案2】:这是一个简单的方法:
first = 1, 4, 9;
list = ConstantArray[False, Max@first];
list[[first]] = True;
list
Out[1]= True, False, False, True, False, False, False, False, True
这是上面写成一个方便函数的解决方案:
Clear[convertIndices]
convertIndices[index_List] :=
Module[list = ConstantArray[False, Max@index],
list[[index]] = True; list]
用法:
convertIndices@1, 4, 9
Out[2]= True, False, False, True, False, False, False, False, True
【讨论】:
list[[first]] = True
我从未想过。这就是我一直在寻找的东西。 :) 简单,美丽。谢谢!
我在上面写了它作为一个方便的函数,所以你需要做的就是传递一个列表给它。请查看我的编辑。
+1,某些思维模式是持久的,我永远不会考虑 list[[first]]=True
,因为我不考虑设置 List
的单个元素。
当然,我有任何机会赶上。 :P
现在我需要做的就是摆脱 Mr.Wizard,我将在这个月成为标签的顶部:D【参考方案3】:
实际上,我自己会使用尤达的答案,但这里有一个替代方案:
first = 1, 4, 9;
MemberQ[first, #] & /@ Range[Max[first]]
(* ===> True, False, False, True, False, False, False, False, True*)
或者这个:
Or @@@ Outer[Equal, Range[Max[first]], first]
(* ===> True, False, False, True, False, False, False, False, True*)
两者都有跳过 Yoda 的 ConstantArray
初始化步骤的优势。
【讨论】:
我实际上不会称其为优势。试试first = 1,4,10^6
。在我的机器上,您的解决方案分别需要 ~2s 和 ~1.5s,而我的解决方案只需要 ~0.035s。
@Yoda 我指的不是执行速度,而是打字努力;-)以上是关于将 Mathematica 值列表转换为布尔列表的主要内容,如果未能解决你的问题,请参考以下文章