7

これは Mathematica でのリスト操作に関する基本的な質問です。各要素が次の図式形式を持つ大きなリストがあります: {List1, List2,Number}。たとえば、

a = {{{1,2,3},{1,3,2},5},{{1,4,5},{1,0,2},10},{{4,5,3},{8,3,4},15}}}.

各サブリストの一部のみを含む新しいリストを作成したいと考えています。たとえば、各サブリストから 3 番目の要素を選択して、上記から {5,10,15} を取得します。または、3 番目の要素をドロップして {{{1,2,3},{1,3,2}},{{1,4,5},{1,0,2}},{{4,5, 3}、{8,3,4}}}。

table コマンドを使用して新しいリストを作成することでこれを行うことができます。

Table[a[[i]][[3]],{i,1,Length[a]}

しかし、大きなリストで機能するより高速な方法があるかどうか疑問に思っていました。

4

3 に答える 3

7

Mathematica バージョン5以降では、キーワード All を複数の方法で使用して、リストのトラバーサルを指定できます。

たとえば、テーブルの代わりに、次のように書くことができます

a[[All,3]]

ここで Mathematica は All を最初の次元で受け入れられるすべてのインデックスに変換し,次の次元の 3 番目のインデックスを取得します.

Mathematica プログラミング言語でループを作成するよりも、通常はこれを行う方が効率的です。選択またはスキャンしたいものが常に存在する同種のリストには本当に問題ありません。

もう 1 つの効率的な表記とショートカットは ;; です。構文:

a[[ All, 1 ;; 2]]

a の最初のレベルをスキャンし、2 番目のケースとまったく同じように、各サブリストの 1 番目から 2 番目の要素まですべてを取得します。

実際、すべてと ;; 任意の数のレベルに組み合わせることができます。;; Mathematica のイテレータと同様の方法で使用することもできます:

a[[ start;;end;;step ]]

と同じことをします

Table[ a[[i]], {i,start,end,step}]

start、end、step のいずれかを省略でき、デフォルトの 1、Length[(暗黙のリストの)]、および 1 で埋められます。

Mathematica のヘルプで調べたいもう 1 つのことは、構造化された式をプログラムで置き換えることができるReplacePartとです。MapAtこれを効率的に使用するための重要な点は、ReplacePart ではパターンを使用して置換対象の座標を指定し、それらに適用する関数を定義できることです。

あなたのデータの例

ReplacePart[a, {_, 3} -> 0]

すべてのサブリストの 3 番目の部分をすべて 0 に置き換えます。

ReplacePart[a, {i : _, 3} :> 2*a[[i, 3]]]

すべてのサブリストの 3 番目の部分ごとに 2 倍になります。

于 2012-10-25T06:29:33.740 に答える
3

著者が示唆しているように、Part に基づくアプローチには適切な形式のデータが必要ですが、ケースはリストの堅牢な分離のために構築されています。

あなたのを使用して、

a = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}};

Cases[a,{_List,_List,n_}:>n,Infinity]

{5, 10, 15}

レコードの他の部分は、同様の形式で抽出できます。

部分ベースのアプローチは、次のような不適切な形式のデータをギャグします。

badA = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 4}};

badA[[All,3]]

{{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2},
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3},
4}}[[All, 3]]

、ただし、ケースはゴミをスキップし、適合するデータのみで動作します

Cases[badA, {_List, _List, s_} :> s, Infinity]

{5, 10, 15}

h番目、

フレッド・クリンガー

于 2012-10-26T14:36:40.760 に答える
1

Part(これの省略形[[...]]):

a[[All, 3]]

a[[All, {1, 2}]]
于 2012-10-25T06:26:26.803 に答える