Преобразование списка значений Mathematica в логический список - PullRequest
6 голосов
/ 06 ноября 2011

Прежде всего, извините за запутанный заголовок.

Я хочу преобразовать {1, 4, 9} в:

{True, False, False, True, False, False, False, False, True}

То есть только индексы из первогоlist будет иметь значение 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}]]

Я все еще хотел быувидеть ваши решения!Этот мне кажется уродливым хаком ...:)

Ответы [ 3 ]

13 голосов
/ 06 ноября 2011

Вот простой подход:

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}
8 голосов
/ 06 ноября 2011

Я бы использовал SparseArray для этой операции. На мой взгляд, это очень легко понять, и это также эффективно, особенно когда низкий процент индексов является истинным.

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 голосов
/ 06 ноября 2011

На самом деле, я бы сам использовал ответ Йоды, но есть альтернатива:

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}*)

Оба имеют преимущество в том, что они пропускают Йоду ConstantArray шаг инициализации.

...