将 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 值列表转换为布尔列表的主要内容,如果未能解决你的问题,请参考以下文章

Python:将字符串列表转换为布尔值,其中布尔值以字符串形式存在[重复]

JS:将布尔列表转换为紧凑字符串?

将 List<boolean> 转换为字符串

Python中列表的布尔值

Python:二进制字符串的布尔列表

Python中的布尔值列表到整数