Python – How to do what I want to do

リスト関係

2次元リストを展開して1次元リストにしたい

itertools.chain.from_iterableを使う。

 

 

2次元リストを転置したい

2次元のリストを転置する方法を、順を追って確認する。

まず2次元リストの要素、すなわち各行を取り出す。リストの要素を分解するにはリストの先頭に'*'をつける。

結果はリストやタプルではなく、独立した3つの子リストが取り出されている。

これらの結果は、zip関数の任意個数の引数として与えることができる。ただしその結果はタプルとして得られる。

この結果を内包表記を使って1つのリストにまとめると、3つのタプル行を含むリストになる。

各行をタプルではなくリストとしたいので、list関数でタプルをリストに変換する。

これで元の2次元リストが転置された。

ndarray関係

1次元配列の2次元化

1次元配列を単に2次元化

1次元配列を2次元一要素の行ベクトルにする方法。

  • np.array([a])と2次元で構築する
  • reshape(1, -1)で2次元1行の配列として変形

1次元配列の列ベクトル化

1次元配列を2次元の列ベクトルにする方法。hstack()などで列ベクトルを横に結合していくときに必要。

  • reshape(-1, 1)でn行1列の配列として変形

2つの1次元配列の結合

縦に積み重ねる

素直に実行するならvstack()を使うのがおすすめ。

  • vstack()は1次元配列のままで積み重ねられる
  • append()は1次元配列を2次元化する必要がある

列ベクトルとして横につなげていく

この場合はhstack()が意外にややこしく、c_が手軽。ただし列ベクトルを意識するならhstack()もアリ。

  • 1次元配列をreshape()で列ベクトル化し、hstack()を使う(1次元配列のままだと横1列に伸びるだけ)
  • c_を使う(1次元配列でも列ベクトル化されて結合される)

空のベクトルへの追加

1次元配列の縦方向への追加

縦方向に追加するならvstack()が全般によさそう。

empty((0, n), dtype=type)で空の配列を準備し、これにvstack()で1次元配列をそのまま追加していく。

1次元配列を列ベクトルとして横方向に追加

empty((n, 0), dtype=type)で空の配列を準備し、1次元配列をreshape()で列ベクトルに変形してhstack()で追加していく。

または、c_を使うとreshape()を使わなくてもそのまま列ベクトルとして追加してくれる。

多次元配列の1次元化

2次元以上の配列を1次元としたいときは、reshape(-1)、flatten()、ravel()メソッド/関数を使う(詳しくはこちら)。

たとえばpyplotのsubplotで2次元の配列として得られたAxesオブジェクト(への参照)に対して全て同じ処理を施したいときに、以下のようにする。

条件による抽出

条件に合う要素を取り出す

条件式による要素の取り出しを参照。

条件に合う要素のインデックスを取り出す

1次元配列の条件に合う行を2次元配列から切り出す

特徴量データの配列のうち、特定のクラスに属するデータだけを取り出したいときなど。

インデックス配列の置き換え

例えばclass_name = np.array(["Class-0", "Class-1", "Class-2"])と定義されているとき、配列np.array([0 1, 2, 0])の各要素をインデックスとしてclass_nameの要素で置き換えたい(numpy.ndarray(['Class-0', 'Class-1', 'Class-2', 'Class-0'])を得たい)。

インデックス配列の置き換えを参照。

統計値の計算

min, max, argmin, argmax

1次元配列のmin()メソッド/max()メソッドを使うと、要素の中の最小値/最大値が得られる。また、argmin()メソッド/argmax()メソッドを使うと、最小の要素/最大の要素のインデックスが得られる。

2次元配列の場合は、a.reshape(-1).min()a.reshape(-1).argmin()などと同じ結果となる。

メソッドの引数でaxis=0を指定すると、各列ごとの最小値/最大値を要素とする1次元配列を得る。

axis=1を指定すると、各行ごとの最小値/最大値を要素とする1次元配列を得る。この場合、この配列を列ベクトルとして考えると対比がわかりやすい。

sum,mean

要素の和や平均を計算するsum()メソッド/mean()メソッドもmin()max()と同じように機能する。

1次元配列の場合。

2次元配列の場合は全要素で計算したスカラーを返す。

axis=0で列ごとに計算した結果を1次元配列で返す。

axis=1で行ごとに計算した結果を1次元配列で返す。この配列が列ベクトルだと解釈すると分かりやすい。

順列や組み合わせを得たい

概要

順列や組み合わせの結果としての要素のコレクションを得たいときは、itertoolsパッケージ使い、結果のイテレーターをforループなどで利用。

要素数(選び出す個数)指定のパラメーター名や省略時の挙動がそれぞれで異なっているので注意。

直積

itertools.product()で直積のイテレーターを得る。

順列

itertools.permutations()で順列のイテレーターを得る。

組み合わせ

itertools.combinations()で組み合わせのイテレーターを得る。

重複組み合わせ

combinations_with_replacement()で重複ありの組み合わせのイテレーターを得る。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です