Array creation

ページ名:Array creation

配列の作成

導入

配列を作成するための一般的なメカニズムは6つあります。

  1. 他のPython構造(リストやタプルなど)からの変換

  2. NumPyに組み込まれている配列作成関数(例:arange、ones、zerosなど)

  3. 既存の配列を複製、結合、または変更する

  4. ディスクから配列を読み込む(標準形式またはカスタム形式のいずれかを使用)。

  5. 文字列またはバッファを使用して、生のバイト列から配列を作成する

  6. 特殊なライブラリ関数(例:random)の使用

これらのメソッドを使用して、ndarray または構造化配列を作成できます。このドキュメントでは、ndarray を作成するための一般的なメソッドについて説明します。

1) PythonシーケンスをNumPy配列に変換する

NumPy配列は、リストやタプルなどのPythonシーケンスを使用して定義できます。リストとタプルは、それぞれとを使用して定義されます[...](...)リストとタプルは、ndarrayの作成を定義できます。

  • 数値のリストは1次元配列を作成します。

  • リストのリストは2次元配列を作成します。

  • さらにネストされたリストは、より高次元の配列を作成します。一般的に、NumPyでは配列オブジェクトはすべてndarrayと呼ばれます。

1, 2, 3, 4])
a2D = np.array(1, 2], [3, 4)
a3D = np.array([1, 2], [3, 4, 5, 6], [7, 8import numpy as np
a1D = np.array([])

numpy.array新しい配列を定義する際には、配列内の要素のデータ型(dtype)を考慮する必要があります。dtypeは明示的に指定できます。この機能により、基となるデータ構造と、C/C++関数で要素がどのように処理されるかをより詳細に制御できます。値が収まらず、かつ を使用している場合dtype、NumPyはエラーを発生させる可能性があります。

import numpy as np
np.array([127, 128, 129], dtype=np.int8)
Traceback (most recent call last):
...
OverflowError: Python integer 128 out of bounds for int8

8ビット符号付き整数は、-128から127までの整数を表します。int8この範囲外の整数を配列に代入すると、オーバーフローが発生します。この機能はしばしば誤解されることがあります。不一致な値で計算を実行するとdtypes、次のような望ましくない結果が生じる可能性があります。

import numpy as np
a = np.array([2, 3, 4], dtype=np.uint32)
b = np.array([5, 6, 7], dtype=np.uint32)
c_unsigned32 = a - b
print('unsigned c:', c_unsigned32, c_unsigned32.dtype)
unsigned c: [4294967293 4294967293 4294967293] uint32
c_signed32 = a - b.astype(np.int32)
print('signed c:', c_signed32, c_signed32.dtype)
signed c: [-3 -3 -3] int64

同じ型の 2 つの配列に対して演算を実行すると dtypeuint32結果の配列は同じ型になります。異なる型の に対して演算を実行するとdtype、NumPy は計算に関係するすべての配列要素を満たす新しい型を割り当てます。ここではuint32、 と はint32両方とも として表現できますint64

NumPy のデフォルトの動作では、配列は 32 ビットまたは 64 ビットの符号付き整数 (プラットフォームに依存し、C 言語のlongサイズに一致) または倍精度浮動小数点数で作成されます。整数配列を特定の型にしたい場合は、配列を作成する際に dtype を指定する必要があります。

2) NumPyの組み込み配列作成関数

NumPyには、配列作成ルーチンで説明されているように、配列を作成するための組み込み関数が40以上あります。これらの関数は、作成する配列の次元に基づいて、おおよそ3つのカテゴリに分類できます。

  1. 1次元配列

  2. 2次元配列

  3. ndarrays

1 - 1次元配列作成関数

1D配列作成関数(例:)はnumpy.linspace、 numpy.arange一般的に少なくとも2つの入力とを必要としstartます stop

numpy.arange定期的に増加する値を持つ配列を作成します。詳細情報と例については、ドキュメントを参照してください。以下にいくつかの例を示します。

import numpy as np
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2, 10, dtype=float)
array([2., 3., 4., 5., 6., 7., 8., 9.])
np.arange(2, 3, 0.1)
array([2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])

注: のベストプラクティスはnumpy.arange、開始値、終了値、ステップ値を整数で使用していただくことです。 に関しては、いくつか微妙な点がありますdtype。 2 番目の例では、dtypeが定義されています。 3 番目の例では、配列は dtype=floatのステップ サイズに対応するように設定されています0.1。丸め誤差のため、 のstop値が時々含まれます。

numpy.linspace指定された数の要素を持ち、指定された開始値と終了値の間で等間隔に配置された配列を作成します。例:

import numpy as np
np.linspace(1., 4., 6)
array([1. , 1.6, 2.2, 2.8, 3.4, 4. ])

この作成関数の利点は、要素の数と開始点および終了点を保証できることです。前の関数には 値は含まれません。arange(start, stop, step)stop

2 - 2次元配列作成関数

2D配列作成関数(例:numpy.eye、、numpy.diagおよび)は、numpy.vander 2D配列として表現される特殊行列のプロパティを定義します。

np.eye(n, m)これは2次元単位行列を定義します。i=j(行インデックスと列インデックスが等しい)の要素は1で、残りは0です。

numpy.diag対角線上に指定された値を持つ正方2次元配列を定義することも 2次元配列が与えられた場合は対角要素のみを含む1次元配列を返すこともできます。これら2つの配列作成関数は、線形代数を行う際に役立ちます。例えば、次のようになります。

1, 2, 3])
array(1, 0, 0],
[0, 2, 0],
[0, 0, 3
1, 2, 3], 1)
array(0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3],
[0, 0, 0, 0
)
a = np.array(1, 2], [3, 4import numpy as np
np.diag([)
np.diag([)
np.diag(a)
array([1, 4])

vander(x, n)ヴァンデルモンド行列を2次元NumPy配列として定義します。ヴァンデルモンド行列の各列は、入力された1次元配列、リスト、またはタプルの次数が減少するべき乗であり、 x最高次数は ですn-1。この配列作成ルーチンは、次のような線形最小二乗モデルを生成するのに役立ちます。

import numpy as np
np.vander(np.linspace(0, 2, 5), 2)
array(0. , 1. ],
[0.5, 1. ],
[1. , 1. ],
[1.5, 1. ],
[2. , 1.
1, 2, 3, 4], 2)
array(1, 1],
[2, 1],
[3, 1],
[4, 1
)

np.vander((1, 2, 3, 4), 4)
array(1, 1, 1, 1],
[ 8, 4, 2, 1],
[27, 9, 3, 1],
[64, 16, 4, 1
)

np.vander([)

3 - 一般的なndarray作成関数

ndarray の作成関数 (例: numpy.ones、、、 ) はnumpy.zerosrandom目的の形状に基づいて配列を定義します。ndarray の作成関数は、タプルまたはリストで次元数とその次元の長さを指定することで、任意の次元の配列を作成できます。

numpy.zeros指定された形状の、0 の値で埋められた配列を作成します。デフォルトの dtype は次のとおりですfloat64

import numpy as np
np.zeros((2, 3))
array(0., 0., 0.],
[0., 0., 0.
)

np.zeros((2, 3, 2))
array([0., 0.],
[0., 0.],
[0., 0.
,


0., 0.],
[0., 0.],
[0., 0.
])

numpy.ones1つの値で埋められた配列を作成します。 zerosその他の点では、以下のものと同一です。

import numpy as np
np.ones((2, 3))
array(1., 1., 1.],
[1., 1., 1.
)

np.ones((2, 3, 2))
array([1., 1.],
[1., 1.],
[1., 1.
,


1., 1.],
[1., 1.],
[1., 1.
])

randomの結果のメソッドは、 0default_rngから1までの乱数値で満たされた配列を作成します。これはnumpy.random ライブラリに含まれています。以下に、形状がそれぞれ(2,3)と(2,3,2)の2つの配列を作成します。シードは42に設定されているため、これらの擬似乱数を再現できます。

numpy.indices各次元ごとに1つずつ配列を作成し(1次元高い配列として積み重ねる)、それぞれの配列はその次元における変動を表す。

import numpy as np
np.indices((3,3))
array([0, 0, 0],
[1, 1, 1],
[2, 2, 2
,

0, 1, 2],
[0, 1, 2],
[0, 1, 2
])

これは、規則的な格子上で多次元関数を評価する場合に特に役立ちます。

3) 既存の配列の複製、結合、または変更

配列を作成したら、既存の配列を複製、結合、または変更して新しい配列を作成できます。配列またはその要素を新しい変数に代入する場合、numpy.copy配列を明示的に指定する必要があります。そうしないと、変数は元の配列へのビューとして扱われます。次の例を考えてみましょう。

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = a[:2]
b += 1
print('a =', a, '; b =', b)
a = [2 3 3 4 5 6] ; b = [2 3]

bこの例では、新しい配列は作成していません。の最初の 2 つの要素を表示する変数を作成しました a。 に 1 を加えると、bに 1 を加えた場合と同じ結果が得られます。新しいa[:2]配列を作成する場合は 、次のように配列作成ルーチンを使用してください。numpy.copy

import numpy as np
a = np.array([1, 2, 3, 4])
b = a[:2].copy()
b += 1
print('a = ', a, 'b = ', b)
a = [1 2 3 4] b = [2 3]

詳細情報と例については、「コピーとビュー」を参照してください。

既存の配列を結合するためのルーチンはいくつかあります。例えばnumpy.vstack、、、 numpy.hstackなどですnumpy.block。以下は、を使用して4つの2×2配列を4×4配列に結合する例ですblock

import numpy as np
A = np.ones((2, 2))
B = np.eye(2, 2)
C = np.zeros((2, 2))
D = np.diag((-3, -4))
np.block(A, B], [C, D)

array(1., 1., 1., 0.],
[ 1., 1., 0., 1.],
[ 0., 0., -3., 0.],
[ 0., 0., 0., -4.
)

他のルーチンでも同様の構文を使用してndarrayを結合します。詳細な例と構文については、ルーチンのドキュメントを参照してください。

4) 標準形式またはカスタム形式のいずれかで、ディスクから配列を読み込む

これは、大規模配列を作成する最も一般的なケースです。詳細は、ディスク上のデータのフォーマットに大きく依存します。このセクションでは、さまざまなフォーマットを処理するための一般的なヒントを示します。入出力のより詳細な例については、「 ファイルの読み書き方法」を参照してください。

標準バイナリ形式

様々な分野において、配列データには標準フォーマットが存在します。以下に、Pythonライブラリを用いて読み込み、NumPy配列として返すことが知られている分野を一覧で示します(他にも読み込み、NumPy配列に変換できる分野があるかもしれませんので、最後のセクションもご確認ください)。

HDF5: h5py
FITS: Astropy

直接読み込むことはできないが、変換が難しくない形式の例としては、PILなどのライブラリでサポートされている形式(jpg、pngなど多くの画像形式の読み書きが可能)が挙げられる。

一般的なASCII形式

カンマ区切り値 (csv) ファイルやタブ区切り値 (tsv) ファイルなどの区切りファイルは、Excel や LabView などのプログラムで使用されます。Python 関数は、これらのファイルを行ごとに読み込んで解析できます。NumPy には、区切りデータを含むファイルをインポートするための標準ルーチンが 2 つありますnumpy.loadtxt 。これらの関数は、ファイルの読み書きnumpy.genfromtxtに関するより複雑な使用例があります 。簡単な例として、次のファイルがあります。simple.csv

$ cat simple.csv
x, y
0, 0
1, 1
2, 4
3, 9

インポートは以下simple.csvを使用して行われますnumpy.loadtxt

import numpy as np
np.loadtxt('simple.csv', delimiter = ',', skiprows = 1)
array(0., 0.],
[1., 1.],
[2., 4.],
[3., 9.
)

scipy.ioより一般的なASCIIファイルは、およびPandasを使用して読み込むことができます。

5) 文字列またはバッファを使用して生バイトから配列を作成する

利用できるアプローチはいくつかあります。ファイルの形式が比較的単純な場合は、シンプルな入出力ライブラリを作成し、NumPy の fromfile()関数と.tofile()メソッドを使用して NumPy 配列を直接読み書きできます (ただし、バイト順序に注意してください)。データを読み取る優れた C または C++ ライブラリが存在する場合は、さまざまな手法でそのライブラリをラップできますが、これは確かに多くの作業が必要となり、C または C++ とのインターフェースにはより高度な知識が求められます。

6) 特殊なライブラリ関数(例:SciPy、pandas、OpenCV)の使用

NumPyは、Pythonの科学計算スタックにおける配列コンテナの基本ライブラリです。SciPy、Pandas、OpenCVなど、多くのPythonライブラリは、データ交換の共通フォーマットとしてNumPy ndarrayを使用しています。これらのライブラリは、NumPy配列を作成、操作、および扱うことができます。

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧