【问题标题】:Converting Mathematica list of values into boolean list将 Mathematica 值列表转换为布尔列表
【发布时间】: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}]]

我仍然希望看到您的解决方案!这对我来说似乎是一个丑陋的黑客...... :)

【问题讨论】:

    标签: list wolfram-mathematica boolean


    【解决方案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 我指的不是执行速度,而是打字努力;-)
      猜你喜欢
      • 1970-01-01
      • 2016-03-09
      • 2021-09-07
      • 1970-01-01
      • 2023-03-21
      • 2017-04-15
      • 1970-01-01
      • 2020-06-26
      • 2014-12-23
      相关资源
      最近更新 更多