推奨事項: NSDT シーン エディターを使用して 3D アプリケーション シーンを迅速に構築する
ナンピーとは何ですか?
Numpy、Scipy、および Matplotlib は、MATLAB のような機能を提供するデータ サイエンス プロジェクトで使用される Python ライブラリです。
Numpy には主に次のような機能があります。
- 型付き多次元配列 (行列)
- 高速数値計算 (行列演算)
- 高度な数学関数
Numpy は Numerical Python の略で、ハイパフォーマンス コンピューティングとデータ分析に必要な必須のソフトウェア パッケージです。NumPy は、大規模なデータ配列の効率性を考慮して設計されているため、Python での数値計算に必要です。
numpy 配列を作成するさまざまな方法
numpy 配列の操作を開始する前に、最初の目標は、問題ステートメントに基づいて要件に従って numpy 配列を作成することに習熟することです。
numpy 配列を作成するにはいくつかの方法があります。いくつかの標準的で実用的な方法を以下に示します。
ケース 1: np.ones メソッドを使用して配列を作成します。
「1 つ」だけの配列を作成する必要がある場合は、このメソッドを利用できます。
np.ones((3,5), dtype=np.float32)
#Output
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
ケース 2: np.zeros メソッドを使用してゼロの配列を作成します。
「ゼロ」のみを含む配列を作成する必要がある場合は、この方法を使用できます。
np.zeros((6,2), dtype=np.int8)
# Output
[[0 0]
[0 0]
[0 0]
[0 0]
[0 0]
[0 0]]
ケース 3: np.arange メソッドを使用する:
要素の配列を順番に作成する必要がある場合は、このメソッドを使用できます。
np.arange(1334,1338)
#Output
[1334 1335 1336 1337]
ケース 4: np.concatenate メソッドを使用する:
このアプローチは、目的の配列が 1 つ以上の配列を組み合わせている場合に適切です。
A = np.ones((2,3))
B = np.zeros((4,3))
C = np.concatenate([A, B])
#Output
[[1. 1. 1.]
[1. 1. 1.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
ケース 5: np.random.random メソッドを使用する:
ランダムな値を含む配列を作成する場合に便利です。
np.random.random((2,3))
#Output
[[0.30512345 0.10055724 0.89505387]
[0.36219316 0.593805 0.7643694 ]]
Numpy 配列操作
numpy 配列の基本的なプロパティを例を挙げて説明します。
コード:
a = numpy.array([[1,2,3],[4,5,6]],dtype=numpy.float32)
# Array dimensions, shape, and data types
print (a.ndim, a.shape, a.dtype)
Output:
2 (2, 3) float32
上記のコードに基づいて、結論として次の点を覚えておく必要があります。
- 配列は、ゼロ (スカラー値に対応) を含む正の整数として任意の次元を持つことができます。
- 配列は型指定されており、np.uint8、np.int64、np.float32、np.float64 などのデータ型を持つことができます。
- 配列は密です。配列のすべての要素が存在し、同じ型を持ちます。
コード:
# Arrays reshaping
a = numpy.array([1,2,3,4,5,6])
a = a.reshape(3,2)
#Output:
[[1 2]
[3 4]
[5 6]]
a = a.reshape(2,-1)
#Output:
[[1 2 3]
[4 5 6]]
a = a.ravel()
#Output:
[1 2 3 4 5 6]
覚えておくべき重要なポイント:
- 再形成操作後は、配列内の要素の総数を変更できません。
- 軸の形状を推測するには、-1 を使用します。
- デフォルトでは、要素は行優先形式で保存されますが、MATLAB では列優先形式です。
デジタルアレイ放送
ブロードキャストにより、互換性がある限り、さまざまな形状の配列に対して操作を実行できます。実際には、配列の小さい次元は、大きい配列の次元に一致するように拡張されます。
Javatpointからの写真
コード:
# arrays broadcasting
a = numpy.array([[1, 2], [3, 4], [5, 6]])
b = numpy.array([10, 20])
c = a + b # Broadcasting the 'b' array to match the dimensions of 'a'
この例には、次元 (2, 3) の 2D NumPy 配列 "a" と形状 (1) の 1D 配列 "b" が含まれています。ブロードキャストにより、演算「a + b」により「b」を仮想的に拡張して 2 次元の「a」と一致させることができ、それによって「a」と拡張された「b」の間で要素ごとの加算を実行できます。
配列のインデックス付けとスライス
- スライスはビューです。スライスに書き込むと、元の配列が上書きされます。
- リストまたはブール配列にもインデックスを付けることができます。
- Python インデックス構文:
start_index : stop_index : step_size
コード:
a = list(range(10))
# first 3 elements
a[:3] # indices 0, 1, 2
# last 3 elements
a[-3:] # indices 7, 8, 9
# indices 3, 5, 7
a[3:8:2]
# indices 4, 3, 2 (this one is tricky)
a[4:1:-1]
ご存知のとおり、画像は多次元配列として視覚化することもできます。したがって、スライスは、画像に対していくつかの数学的操作を実行するのにも役立ちます。理解を深めるために、いくつかの重要かつ高度な例を以下に挙げます。
# Select all but one-pixel border
pixel_matrix[1:-1,1:-1]
# swap channel order
pixel_matrix = pixel_matrix[:,:,::-1]
# Set dark pixels to black
pixel_matrix[pixel_matrix<10] = 0
# select 2nd and 4th-row
pixel_matrix[[1,3], :]
配列の集約と削減
ここで、numpy 配列に対する集計操作を始めます。通常、できることは次のとおりです。
- 配列内のすべての要素の合計と積を求めます。
- 配列内の最大要素と最小要素を見つける
- 配列内の特定の要素の数を見つける
- 線形代数モジュールを使用して、行列行列式、行列トレース、行列固有値、固有ベクトルなどの他のパラメーターを見つけることもできます。
例を挙げて各機能について説明していきましょう。
ケース 1: 配列内に存在するすべての要素の代数和
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.sum())
#Output:
21
ケース 2: 配列内の最大要素
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.max())
#Output:
6
ケース 3: 配列内の最小要素
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.min())
#Output:
1
ケース 4: 配列内の最大の要素が配置される要素の位置/インデックス
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.argmax())
#Output:
5
ケース 5: 配列内の最小要素が配置される要素の位置/インデックス
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.argmin())
#Output:
0
場所を見つけるときに、多次元配列を 1 次元配列として扱い、それに対して計算を実行することがわかります。
ケース 6: 配列内のすべての要素の平均/平均
array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.mean())
#Output:
3.5
ケース 7: 2 次元配列の内積/スカラー積
array_1 = numpy.array([[1,2], [4,5]])
array_2 = numpy.array([[1,-1,2], [3,7,-2]])
t = array_1.dot(array_2)
print(t)
#Output:
[[ 7 13 -2]
[19 31 -2]]
数値配列のベクトル化
ベクトル化により、個々の要素を反復処理するのではなく、配列全体に対して操作を実行できるようになります。最適化された低レベルのルーチンを活用し、より高速でクリーンなコードを実現します。
コード:
a = numpy.array([1, 2, 3, 4, 5])
b = numpy.array([10, 20, 30, 40, 50])
c = a + b # Element-wise addition without explicit loops
上記の例に基づくと、「a」と「b」という名前の 2 つの NumPy 配列が作成されていることがわかります。演算「a + b」の実行中に、ベクトル化の概念を使用して配列間で要素ごとの加算を実行し、その結果、「a」と「b」の対応する要素の合計を含む新しい配列「c」が生成されます。したがって、プログラムは要素ごとの操作による明示的なループの実行を回避し、効率的な計算のために最適化されたルーチンを利用します。
配列の連結
ケース 1: concatenate 関数を使用して連結する 2 つ以上の配列があるとします。配列のタプルを連結する必要があります。
コード:
# concatenate 2 or more arrays using concatenate function row-wise
numpy_array_1 = numpy.array([1,2,3])
numpy_array_2 = numpy.array([4,5,6])
numpy_array_3 = numpy.array([7,8,9])
array_concatenate = numpy.concatenate((numpy_array_1, numpy_array_2, numpy_array_3))
print(array_concatenate)
#Output:
[1 2 3 4 5 6 7 8 9]
ケース 2: 複数の次元を持つ配列があるとします。その場合、配列を結合するには、これらの配列を結合する必要がある軸を指定する必要があります。それ以外の場合は、最初の次元に沿って実行されます。
コード:
# concatenate 2 or more arrays using concatenate function column-wise
array_1 = numpy.array([[1,2,3], [4,5,6]])
array_2 = numpy.array([[7,8,9], [10, 11, 12]])
array_concatenate = numpy.concatenate((array_1, array_2), axis=1)
print(array_concatenate)
#Output:
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
数学関数と一般関数
これらのユニバーサル関数は ufuncs とも呼ばれます。要素ごとの操作はこれらの関数内で実行されます。例えば:
- NP.exp
- NP.sqrt
- 新県
- NP.cos
- NP.イスナン
コード:
A = np.array([1,4,9,16,25])
B = np.sqrt(A)
#Output
[1. 2. 3. 4. 5.]
性能比較
Python では数値計算を実行する際、計算量が多いと非常に時間がかかります。1000 x 1000 の形状の行列を取得し、行列の乗算を行う場合、Python と numpy で必要な時間は次のとおりです。
- Python のトリプルループには 10 分以上かかります
- デジタルには約0.03秒かかります
したがって、上記の例から、numpy は標準の Python よりもはるかに短い時間がかかることがわかり、そのため、処理する膨大な量のデータがあるデータ サイエンスに関連する現実の状況ではレイテンシーが短縮されます。
まとめ
この記事では、numpy 配列について説明しました。それでは、セッションを終えるにあたり、Python に対する numpy の利点をまとめてみましょう。
- Numpy には配列指向の計算があります。
- Numpy は多次元配列を効率的に実装します。
- Numpy は主に科学計算用に設計されています。
- Numpy には、ループなしで配列の計算を高速化するための標準数学関数が含まれています。
- Numpy には、フーリエ変換関数を使用できる線形代数および乱数生成モジュールが組み込まれています。
- Numpy には、配列をディスクに読み書きしたり、メモリ マップされたファイルを操作したりするためのツールも含まれています。