2

分析のためにスプレッドシートを Mathematica に頻繁にインポートしていますが、分析のために連続していない要素を選択する簡単な方法をコーディングするのに苦労しています。たとえば、20 列と 100 行のスプレッドシートをインポートする場合、通常、選択した行/列を削除する必要があります。

この例では、すべての行と列 2、4、7 ~ 17 が必要です。次のコードは機能するはずですが、エラーになります。

v[[ All, {2,4,7;;17} ]]

代わりに私は使用しています:

v[[ All, {2,4,7,8,9,10,11,12,13,14,15,16,17} ]]

Span (;;) を使用して、列のブロック (7-17) を選択しながら、私の例で行 2 と 4 を選択することは可能ですか?

4

3 に答える 3

1

x ;; y 構文は Part に対する特別な引数であり、リストの作成に使用できる一般的な構文ではありません。したがって、v[[ All, 7;;17 ]] と言うことができますが、v[[All, {7;;17}]] とは言えません。後者は、整数のリストでも、Part が認識できる特別な構文でもありません。

しかし、あなたの問題を解決するのはとても簡単です。あなたが試すことができます:

v[[All, {2,4}~Join~Table[x,{x,7,17}] ]]

たとえば、または

Join[v[[All, {2, 4}]], v[[All, 7 ;; 17]], 2]

幸運を!

于 2012-10-16T05:45:55.197 に答える
0

Partこれは、との既知の制限ですSpan。私自身の密接に関連する質問を参照してください:

部品とスパン: これが機能しない*はず*の理由はありますか?

あなたのソリューションは、最も一般的な回避策です。インデックスのリストを作成するのが不便すぎる場合は、カスタム Part 関数を使用して簡単にすることができます。例えば:

SetAttributes[part, HoldFirst]

part[x_, parts__] := x[[##]] & @@ Flatten /@ ({parts} /. Span -> Range)

使用する:

a = Range@24 ~Partition~ 4;

part[a, {1 ;; 3, 6}, {1, 3 ;; 4}]
{{1, 3, 4}, {5, 7, 8}, {9, 11, 12}, {21, 23, 24}}

これは、かなり複雑な負のインデックス スパンを処理しようとはしませんが、少なくともいくつかのアイデアを提供するのに役立つかもしれません。

于 2012-10-16T13:19:30.327 に答える
0

別のアプローチ..

pys[{all___}] := 
 Flatten[(Switch[Head[#], Span, 
      Range @@ (# /. Span -> List), __, #]) & /@ {all}] 
list = Range[100];
list[[pys[{1, 3 ;; 12 ;; 2, 19, -3 ;; -1}] ]]

{1, 3, 5, 7, 9, 11, 19, 98, 99, 100}

これは特に、オープン エンド {1,3;;} または混合 +/- スパン { 5;;-5 } を処理しません。

于 2012-10-16T15:14:38.170 に答える