Python行列ライブラリnumpyドキュメントの中国語翻訳

しびれる

Pythonのリストデータ構造とnumpyの配列データ構造の違い

リスト内のデータはさまざまなタイプにすることができますが、配列内のデータは同型データ構造である必要があります。

Numpy は list よりも高速で、データの保存に使用するメモリの使用量が少なく、データ型を指定するメカニズムを提供します。これにより、コードの最適化がさらに一歩進みます。

配列とは何ですか

配列はnumpyの重要なデータ構造です。配列は、生データ、要素の検索方法、要素の解析方法に関する情報を含む数値グリッドです。要素のグリッドにはさまざまな方法でインデックスを付けることができます。要素はすべて同じ型であり、配列の dtype (データ型) と呼ばれます。

配列には、非負の整数、ブール値、別の配列、整数のタプルなど、さまざまな方法でインデックスを付けることができます。配列のランクは配列の次元数です。shape は、各次元に沿った配列のサイズを示す整数のタプルです。

numpy 配列を初期化する 1 つの方法は、Python リストから、ネストされたリストを使用して 2 次元および高次元のデータを生成することです。

a = np.array([1,2,3,4,5,6])
a.shape (6,)

a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a.shape (3, 4)

配列の要素には角括弧を使用してアクセスできます。要素にアクセスするときは、numpy インデックスが 0 から始まることに注意してください。これは、最初の要素にアクセスしたい場合は添字 0 を使用することを意味します。

print(a[0])
[1,2,3,4]

配列の詳細

このパートでは、1 次元配列、2 次元配列、ndarray、ベクトル、行列について説明します。

「n 次元配列」の略称である ndarray と呼ばれる配列を聞いたことがあるかもしれません。N 次元配列は、単に任意の次元の配列です。1-D (1 次元) または 1 次元配列、および 2-D または 2 次元配列についても聞いたことがあるかもしれません。numpy の Ndarray は行列とベクトルの両方を表現できます。ベクトル (vector) は 1 次元のみの配列 (行ベクトルと列ベクトルに違いはありません) ですが、行列 (matrix) は 2 次元の配列を表します。3 次元 (三次元) およびそれ以上の次元の配列は、多くの場合、テンソルという用語で表されます。

配列 array のプロパティとは何ですか

配列は、要素が同じデータ型とサイズを持つ固定サイズのコンテナーとしてよく使用されます。配列の次元数と要素数は、その形状によってすでに定義されています。配列の形状は、各次元のサイズを指定する非負の整数のタプルです。

numpyでは次元をaxes(座標軸)と呼びます。これは、次のような 2 ビット配列がある場合を意味します。

[[0.,0.,0.],
 [1.,1.,1.]]

この配列には 2 つの軸 (座標軸) があります。最初の軸の長さは 2 で、2 番目の軸の長さは 3 です。(2行3列のデータ/行列)

他の Python コンテナ オブジェクトと同様に、配列の内容は、インデックス付けまたは配列スライスを通じてアクセスまたは変更できます。一般的なコンテナ オブジェクトとは異なり、異なる配列が同じデータを共有できるため、ある配列への変更が別の配列に表示される可能性があります。

配列のプロパティは配列の内部情報を反映します。配列のプロパティを取得または設定する必要がある場合、配列を再作成する必要はなく、プロパティを通じて配列にアクセスできます。

基本配列の作成方法

この部分には、np.array()、np.zeros()、np.ones()、np.empty()、np.arange()、np.linsapce()、dtypeが含まれます。

numpy 配列を作成するには、関数 np.array() を使用できます。

必要なのは、リストを配列に渡すことだけです。必要に応じて、リスト データのデータ型を指定することもできます。

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

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Dye1MvBS-1691137027881)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/c17b529a-6087-43ca-a402-99306a5ed266/Untitled.png)]

これらの視覚化は、概念を簡素化し、numpy の概念と構成の基本的な理解を提供することを目的としていることに注意してください。配列と配列演算は、ここで示すものよりも複雑です。

一連の要素の配列を作成する代わりに、ゼロで埋められた配列を簡単に作成できます。

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

または 1 が入った配列

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

空の配列でも。関数 empty は、初期化内容がランダムで、その時点のメモリの状態に完全に依存する配列を作成します。ゼロ (または同様の関数) の代わりに空を使用する理由は、高速であり、各要素の値を初期値で埋める必要があるかどうかをチェックするためです。

np.empty(2) 
array([3.14, 42.  ])  # may vary

範囲内の値を含む配列を作成できます

np.arange(4)
array([0,1,2,3])

等間隔のデータも含めることができます。間隔の最初の数値、最後の数値、およびステップ サイズを指定する必要があります。

np.arange(2, 9, 2)
array([2,4,6,8])

np.linspace() は、特定の間隔で配置されたデータの配列を作成します

np.linspace(0, 10, num=5)
array([ 0. ,  2.5,  5. ,  7.5, 10. ])

データ型を指定します

デフォルトのデータ型は浮動小数点数 np.float64 ですが、dtype キーワードを通じてデータ型を指定できます。

x = np.ones(2, dtype=np.int64)
x
array([1,1])

要素の追加、削除、並べ替え

この部分では、np.sosrt() と np.concatenate() について説明します。

np.sort() を使用して要素を並べ替えるのは簡単です。軸、種類、順序を指定できます。

arr = np.array([2,1,5,3,7,4,6,8])
np.sort(arr)

配列のコピーを返すsort関数の場合は、次のように使用できます。

argsort: 指定された軸に沿った間接ソート

lexsort: 複数のキーに対する間接的な安定したソート

searchsorted: ソートされた配列内の要素を検索します。

パーティション:部分的な並べ替え

次の配列を使用する場合

a = np.array([1,2,3,4])
b = np.array([5,6,7,8])

np.concatenate() 関数を使用して 2 つの配列を連結できます

以下の配列から開始する場合

x = np.array([[1,2],[3,4]])
y = np.array([[5,6]])
axis()与数组括号的对应关系
numpy数组都有[]标记,其对应关系:
axis=0对应最外层的[]
axis=1对应第二外层的[]
axis=n对应第n外层的[]
以三维数组为例,两者关系如下表所示

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-KjCMHN0k-1691137027882)(https://s3-us-west-2.amazonaws) .com/secure.notion -static.com/db539c3a-b9a0-4c41-96f2-4316202afd9b/Untitled.png)]

np.concatenate((x,y),axis=0)
array([[1,2],
				[3,4],
				[5,6]])

配列から要素を削除するには、インデックスによって保持したい配列内の要素を選択するのが簡単です。

配列の形状とサイズを知る方法

このパートでは、ndarray.ndim、ndarray.size、ndarray.shape について説明します。

ndarray.ndim は、軸の数または配列の次元を示します。

ndarray.size は、配列内の要素の合計数を示します。これは配列要素の形状の積です。

ndarray.shape は、配列が各次元に格納する要素の数を表す整数のタプルを表示します。たとえば、2 行 3 列の 2 次元配列の場合、形状は (2, 3) になります。

array_example = np.array([[[0, 1, 2, 3],
                           [4, 5, 6, 7]],

                          [[0, 1, 2, 3],
                           [4, 5, 6, 7]],

                          [[0 ,1 ,2, 3],
                           [4, 5, 6, 7]]])

配列の次元を取得する

array_example.ndim
3

配列内の要素の総数を取得します

array_example.size
24

配列の形状を取得する

array_example.shape324

reshapeを使用して形状を変更できます

reshape() を使用すると新しい形状が得られますが、配列は既存のデータの値を変更しません。

覚えておくべきことは、配列を再形成する場合、結果の配列には元の配列と同じ数の要素が含まれている必要があるということです。配列に最初に 12 個の要素があった場合、新しい配列にも合計 12 個の要素が含まれることに注意してください。

配列が次で始まる場合:

a = np.arange(6)
print(a)

reshape() 関数を使用して配列の形状を変更できます。たとえば、この配列を 3 行 2 列の別の配列に再形成できます。

b = a.reshape(3, 2)
print(b)
[[0 1]
 [2 3]
 [4 5]]

np.reshape の場合、いくつかのオプションのパラメーターを指定できます。

np.reshape(a, newshape=(1,6), order='C')

newshape は、指定する新しい形状です。整数または整数のタプルを指定する必要があります。

順序: C は、読み取りおよび書き込み要素が C のようなインデックス順序を使用することを意味します。F は、読み取りおよび書き込み要素が Fortran のようなインデックス順序を使用することを意味します。A は、a がメモリ内で連続した Fortran の場合、読み取りおよび書き込み要素が Fortran のようなインデックス順序を使用することを意味します。その他の場合クラス C の順序を使用します。

1次元配列を2次元配列に変換する方法(配列に新しい軸axisを追加する方法)

この部分では、np.newaxis、np.expand_dims について説明します。

np.newaxis と np.expand_dims を使用して、既存の配列に次元を追加できます。

np.newaxis を使用すると、毎回配列に次元が追加されます。これは、1D データが 2D 配列になり、2D 配列が 3D 配列になることを意味します。

初期配列が次のような場合

a = np.array([1,2,3,4,5,6])
a.shape
(6,)

np.newaxis を使用して新しい軸を追加します

a2=a[np.newaxis, :]
a2.shape
(1, 6)

np.newaxis を使用して、1D 配列を行ベクトルまたは列ベクトルに明示的に変換できます。たとえば、次のように最初の次元に沿って軸を挿入することで、1D 配列を行ベクトルに変換できます。

row_vector = a[np.newaxis, :]
row_vector.shape16

np.expand_dims を使用して、指定した位置に軸を挿入することもできます

a = np.array([1,2,3,4,5,6])
a.shape
(6,)

np.expand_dims によりインデックス位置 1 に軸を追加します

b = np.expand_dims(a, axis=1)
b.shape
(6,1)

インデックス位置 0 に軸を追加します

c = np.expand_dims(a, axis=0)
c.shape
(1, 6)

インデックス作成とスライス

Python リストと同じように numpy 配列を操作できます

data = np.array([1, 2, 3])

data[1]
2
data[0:2]
array([1, 2])
data[1:]
array([2, 3])
data[-2:]
array([2, 3])

配列から何らかの条件を満たす値を選択したい場合は、NumPyを使えば簡単です。

たとえば、初期配列は次のようになります

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

配列内の5未満の値を出力します

print(a[a<5])
[1 2 3 4]

5 以上の値を選択することもできます

a[a>=5]
array([ 5,  6,  7,  8,  9, 10, 11, 12])

既存のデータから配列を作成する方法

このパートでは、スライスとインデックス付け、np.vstack()、np.hstack()、np.hsplit()、.view()、copy() について説明します。

既存の配列から新しい配列を作成するのは簡単です

a = np.array([1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
arr1 = a[3:8]
arr1
array([4, 5, 6, 7, 8])

2 つの既存のアレイを垂直または水平にスタックすることもできます。

たとえば、最初は 2 つの配列 a1、a2 があります。

a1 = np.array([[1, 1],
               [2, 2]])

a2 = np.array([[3, 3],
               [4, 4]])

vstackを使用すると垂直に積み重ねることができます

np.vstack((a1, a2))
array([[1, 1],
       [2, 2],
       [3, 3],
       [4, 4]])

または、hstack を使用して水平に積み重ねます

np.hstack((a1, a2))
array([[1, 1, 3, 3],
       [2, 2, 4, 4]])

hsplit 関数を使用すると、配列を複数の小さな配列に分割できます。返すアイソフォーム配列の数を指定したり、分割する列を指定したりすることもできます。

たとえば、初期配列は次のようになります

x = np.arange(1, 25).reshape(2, 12)
x
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])

この配列を同じ形状の 3 つの配列に分割したい場合は、次のようにすることができます。

np.hsplit(x, 3)
[array([[ 1,  2,  3,  4],
        [13, 14, 15, 16]]),
 array([[ 5,  6,  7,  8],
        [17, 18, 19, 20]]),
 array([[ 9, 10, 11, 12],
        [21, 22, 23, 24]])]

3列目と4列目の後で分割したい場合は、次のように実行できます。

np.hsplit(x, (3, 4))
  [array([[ 1,  2,  3],
         [13, 14, 15]]), array([[ 4],
         [16]]), array([[ 5,  6,  7,  8,  9, 10, 11, 12],
         [17, 18, 19, 20, 21, 22, 23, 24]])]

view 関数を使用すると、元の配列 (シャドウ コピー) に似た新しい配列オブジェクトを作成できます。

ビューは重要な numpy 概念です。Numpy 関数、つまりインデックス付けやスライスなどの操作は、可能な限りビューを返します。これによりメモリが節約され、高速になります (データのコピーが不要)。ただし、知っておくべき重要なことは、ビュー内のデータを変更すると元の配列も変更されるということです。

配列を作成する

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

次に、 a に対してスライス操作を実行して配列 b1 を作成し、その最初の要素を変更します。これにより、対応する要素も変更されます。

b1 = a[0, :]
b1
array([1, 2, 3, 4])
b1[0] = 99
b1
array([99,  2,  3,  4])
a
array([[99,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

copy 関数を使用すると、データを含む配列の完全なコピー (ディープ コピー) が作成されます。このように使用できます

b2 = a.copy()

配列の基本操作

この部分には、加算、フェンシング、乗算、除算などが含まれます。

アレイを作成したら、使用を開始できます。たとえば、2 つの配列が作成され、1 つは data と呼ばれ、もう 1 つは ones と呼ばれます。

data = np.array([1, 2])
ones = np.ones(2, dtype=int)
data + ones
array([2, 3])

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-WgjvYaXh-1691137027883)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/b630c89c-b88a-49c3-9428-9838a5199a66/Untitled.png)]

できる演算は足し算だけではありません

data - ones
array([0, 1])
data * data
array([1, 4])
data / data
array([1., 1.])

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NzlULVFK-1691137027883)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/371c3ed3-041b-4924-8783-e8550910dc06/Untitled.png)]

numpy の基本的な操作は非常に簡単です。配列内のすべての要素の合計を取得したい場合は、sum() 関数を使用できます。これは、1D 配列、2D 配列、および高次元配列で機能します。

開始時の配列

b = np.array([[1,1], [2,2]])

行軸の合計が要求された場合

b.sum(axis=0)
array([3,3])

列軸の合計を求めます

b.sum(axis=1)
array([2,4])

放送

場合によっては、配列と個々の数値の間で演算 (ベクトル間演算とも呼ばれます)、またはサイズの異なる 2 つの配列間で演算を実行する必要がある場合があります。たとえば、配列 (データと呼びます) にはマイル単位の例が含まれている場合がありますが、この情報をキロメートルに変換したいとします。次のことができます

data = np.array([1.0, 2.0])
data * 1.6
array([1.6, 3.2])

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-XhY0gzdP-1691137027883)(https://s3-us-west-2.amazonaws) .com/secure.notion -static.com/841d46e4-f1e8-40e1-8f23-db4222d7d44c/Untitled.png)]

Numpy は、乗算はすべてのセルで実行される必要があることを理解しています。この概念はブロードキャストと呼ばれます。ブロードキャスト メカニズムにより、numpy がさまざまな形状で動作できるようになります。配列の次元には互換性がなければなりません。たとえば、2 つの配列の次元が同じであるか、一方の配列が 1 である場合、次元に互換性がない場合は、ValueError が報告されます。

その他の便利な配列演算

この部分では、最大値、最小値、合計、平均、乗算、標準偏差、およびその他の関連演算について説明します。

numpy では集計操作が可能です。min、max、sumに加えて、平均値を取得するmean、すべての要素を乗算した結果を取得するprod、標準偏差を取得するstdなども簡単に実行できます。

data.max()
2.0
data.min()
1.0
data.sum()
3.0

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-gAUEiEZ2-1691137027884)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/4fc5216e-2b81-4eac-9c47-ac44428cb2b3/Untitled.png)]

配列を設定します。

a = np.array([[0.45053314, 0.17296777, 0.34376245, 0.5510652],
              [0.54627315, 0.05093587, 0.40067661, 0.55645993],
              [0.12697628, 0.82485143, 0.26590556, 0.56917101]])

非常に一般的なのは、特定の行または列に沿って集計することです。デフォルトでは、すべての numpy 集計関数は配列全体の集計結果を返します。

集計値を計算する軸を指定できます。たとえば、axis=0 と指定すると、各列の最小値を見つけることができます。

a.min(axis=0)
array([0.12697628, 0.05093587, 0.26590556, 0.5510652 ])

マトリックスの作成

Python リストを渡すことで、2 次元配列 (または行列) を作成して numpy で表すことができます。

data = np.array([[1,2], [3,4], [5,6]])
data

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Un4zEicZ-1691137027884)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/c988f980-4ae5-4e85-9593-b4c1f9551cda/Untitled.png)]

インデックス付けとスライス操作は、行列を操作するときに便利です。

data[0, 1]
2
data[1:3]
array([[3, 4],
       [5, 6]])
data[0:2, 0]
array([1, 3])

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-yz2VAFYK-1691137027884)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/4ab91904-487d-4e8b-893e-88334bb5284f/Untitled.png)]

data.max()
6
>>> data.min()
1
>>> data.sum()
21

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-VlUOxcZL-1691137027884)(https://s3-us-west-2. amazonaws.com/secure.notion -static.com/d2d6cffc-f370-4e08-b056-3165980211a4/Untitled.png)]

マトリックスのすべての値を集計することも、axis パラメーターを使用して値を行または列に集計することもできます。これを説明するために、わずかに変更されたデータセットを見てみましょう。

data = np.array([[1, 2], [5, 3], [4, 6]])
data
array([[1, 2],
       [5, 3],
       [4, 6]])
data.max(axis=0)
array([5, 6])
data.max(axis=1)
array([2, 5, 6])

行列を作成したら、2 つの行列が同じサイズであれば、算術演算子を使用して加算または乗算できます。

data = np.array([[1, 2], [3, 4]])
ones = np.array([[1, 1], [1, 1]])
data + ones
array([[2, 3],
       [4, 5]])

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-4QFjSRa6-1691137027885)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/ea7c7739-e696-4a32-b6cd-d6a83c6cb8c9/Untitled.png)]

異なるサイズの行列に対して一部の操作を実行できますが、これはいずれかの行列に 1 行または 1 列しかない場合に限られます。この場合、numpy はこの操作にブロードキャスト ルールを使用します。

data = np.array([[1, 2], [3, 4], [5, 6]])
ones_row = np.array([[1, 1]])
data + ones_row
array([[2, 3],
       [4, 5],
       [6, 7]])

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-zGVpdq04-1691137027885)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/a9bff327-c3a9-4dcf-9f12-cf44ab5810cb/Untitled.png)]

NumPy が n 次元配列を出力する場合、最後の軸のループ処理が最も速く、最初の軸のループ速度が最も遅いことに注意してください。例えば:

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

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

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

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

通常、NumPy で配列を値で初期化する必要があります。Numpy は、乱数を生成するために、ones()、zeros()、random.Generator クラスを提供します。必要なのは、生成したい量を渡すことだけです。

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

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

rng = np.random.default_rng()
rng.random(13)
array([0.15373629, 0.69898599, 0.77647242])

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7KR5ou0G-1691137027885)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/3841c017-374c-4c7d-858a-51a0720ad0ae/Untitled.png)]

パラメーターを渡すときに行列の次元を記述するタプルを指定すると、ones()、zeros()、random() を使用して 2 次元配列を作成できます。

np.ones((3, 2))
array([[1., 1.],
       [1., 1.],
       [1., 1.]])
np.zeros((3, 2))
array([[0., 0.],
       [0., 0.],
       [0., 0.]])
rng.random((3, 2)) 
array([[0.01652764, 0.81327024],
       [0.91275558, 0.60663578],
       [0.72949656, 0.54362499]])  # may vary

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-AJ3R4G54-1691137027885)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/217407b8-7961-45a2-91d3-a4e6d4c0bcdf/Untitled.png)]

乱数を生成する

生成された乱数の使用は、数学と機械学習を必要とするアルゴリズムの構成と評価の重要な部分です。人工ニューラル ネットワークの重みをランダムに初期化する必要がある場合でも、データをランダムなセットに分割する必要がある場合でも、データセットをランダムにシャッフルする必要がある場合でも、乱数 (実際には反復可能な擬似乱数) を生成できなければなりません。

Genrator.integers を使用すると、低位から高位まで (クローズされる前とオープンされる前に) ランダムな整数を生成できます。endpoint=True に設定すると、間隔をフロントクローズ間隔とバッククローズ間隔にすることができます。

0 ~ 4 のランダムな整数からなる 2 行 4 列の配列を生成できます。

rng.integers(5, size=(2, 4)) 
array([[2, 1, 1, 0],
       [0, 0, 0, 4]])  # may vary

重複排除された要素と数量を取得する方法

この部分では np.unique() について説明します。

np.unique を使用すると、配列から重複する要素を見つけることができます。

たとえば、開始配列は次のとおりです。

a = np.array([11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20])

np.unique を使用して配列内の重複排除された値を出力します

unique_values = np.unique(a)
print(unique_values)
[11 12 13 14 15 16 17 18 19 20]

NumPy 配列内の一意の値 (配列内の一意の値の最初のインデックス位置にある配列) のインデックスを取得するには、配列と一緒に np.unique() の return_index パラメーターを渡すだけです。

unique_values, indices_list = np.unique(a, return_index=True)
print(indices_list)
[ 0  2  3  4  5  6  7 12 13 14]

return_counts パラメータを渡すことで、numpy 配列の一意の値の数を取得できます

unique_values, occurrence_count = np.unique(a, return_counts=True)
print(occurrence_count)
[3 2 2 2 1 1 1 1 1 1]

これは 2D データでも同様に機能します。最初の配列が次のようであった場合

a_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 4]])

ユニークな価値観が見つかる

unique_values = np.unique(a_2d)
print(unique_values)
[ 1  2  3  4  5  6  7  8  9 10 11 12]

軸引数が渡されない場合、2D 配列はフラット化されます。一意の行または列が必要な場合は、必ず axis パラメータを渡してください。一意の行を検索するには、axis=0 を指定し、列の場合は axis=1 を指定します。

unique_rows = np.unique(a_2d, axis=0)
print(unique_rows)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

一意の行、インデックス位置、出現数を取得するには、次を使用できます。

unique_rows, indices, occurrence_count = np.unique(
     a_2d, axis=0, return_counts=True, return_index=True)
print(unique_rows)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
print(indices)
[0 1 2]
print(occurrence_count)
[2 1 1]

行列を転置して再形成する

このパートでは、arr.reshape()、arr.transpose()、arr.T について説明します。

多くの場合、行列を転置する必要があります。NumPy 配列には、行列を転置できる属性 T があります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-8r3zRsrQ-1691137027885)(https://s3-us-west-2.amazonaws) .com/secure.notion -static.com/b5b032af-c991-4ce7-991e-b3a7baefa2c8/Untitled.png)]

マトリックスの次元を変換する必要がある場合もあります。これは、たとえば、データセットとは異なる特定の入力形状を予期するモデルがある場合に発生する可能性があります。ここで、reshape メソッドが役に立ちます。必要な行列の新しい次元を渡すだけです。

data.reshape(2, 3)
array([[1, 2, 3],
       [4, 5, 6]])
data.reshape(3, 2)
array([[1, 2],
       [3, 4],
       [5, 6]])

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-TDcjGhEk-1691137027886)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/d6fd0746-3f51-47a7-a407-18ab95b762b6/Untitled.png)]

.transpose() を使用して、指定した値に基づいて配列の軸を反転または変更することもできます。

開始マトリックスは次のとおりです

arr = np.arange(6).reshape((2, 3))
arr
array([[0, 1, 2],
       [3, 4, 5]])

arr.transpose() を使用して配列を転置できます。

arr.transpose()
array([[0, 3],
       [1, 4],
       [2, 5]])

arr.T を使用して達成することもできます

arr.T
array([[0, 3],
       [1, 4],
       [2, 5]])

逆行列を作る方法

この部分では np.flip() について説明します。

numpy の np.flip() 関数を使用すると、配列の内容を 1 つの軸に沿って反転または反転できます。np.flip()を使用する場合は、反転したい配列と軸axisを指定します。軸を指定しない場合、numpy はすべての軸に沿ってコンテンツを反転します。

1D 配列を反転する

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

reversed_arr = np.flip(arr)
print('Reversed Array: ', reversed_arr)
Reversed Array:  [8 7 6 5 4 3 2 1]

2D 配列を反転する

arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

reversed_arr = np.flip(arr_2d)
print(reversed_arr)
[[12 11 10  9]
 [ 8  7  6  5]
 [ 4  3  2  1]]

線を反転するだけで簡単にできます

reversed_arr_rows = np.flip(arr_2d, axis=0)
print(reversed_arr_rows)
[[ 9 10 11 12]
 [ 5  6  7  8]
 [ 1  2  3  4]]

または列を反転するだけです

reversed_arr_columns = np.flip(arr_2d, axis=1)
print(reversed_arr_columns)
[[ 4  3  2  1]
 [ 8  7  6  5]
 [12 11 10  9]]

1行または1列のみを反転することもでき、インデックス位置が1の行のデータを反転することもできます

arr_2d[1] = np.flip(arr_2d[1])
print(arr_2d)
[[ 1  2  3  4]
 [ 8  7  6  5]
 [ 9 10 11 12]]

インデックス位置 1 の列を逆にすることもできます。

arr_2d[:,1] = np.flip(arr_2d[:,1])
print(arr_2d)
[[ 1 10  3  4]
 [ 8  7  6  5]
 [ 9  2 11 12]]

多次元配列の形状を変更して平坦化する

この部分では flatten()、ravel() について説明します。

配列をフラット化するには、. flatten() と .ravel() という 2 つの一般的な方法があります。2 つの主な違いは、ravel() で作成された新しい配列が実際には親配列への参照 (つまり「ビュー」) であることです。これは、新しい配列への変更は親配列にも影響することを意味します。ravel はコピーを作成しないため、メモリ効率が非常に優れています。

x = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

flatten を使用して配列を 1 次元データに変換できます

x.flatten()
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

flatten を使用すると、新しい配列への変更は元の配列に影響しません。

a1 = x.flatten()
a1[0] = 99
print(x)  # Original array
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
print(a1)  # New array
[99  2  3  4  5  6  7  8  9 10 11 12]

ただし、ravel を使用すると、新しい配列への変更は元の配列に影響します。

a2 = x.ravel()
a2[0] = 98
print(x)  # Original array
[[98  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
print(a2)  # New array
[98  2  3  4  5  6  7  8  9 10 11 12]

詳細については、docstring にアクセスする方法を参照してください。

この部分には help()、? が含まれます。そして??

データ サイエンス エコシステムに関しては、Python と NumPy はユーザーを念頭に置いて構築されています。最良の例の 1 つは、組み込みのドキュメントへのアクセスです。各オブジェクトには、docstring と呼ばれる文字列への参照が含まれています。ほとんどの場合、この docstring には、オブジェクトとその使用方法の簡単で簡潔な概要が含まれています。Python には、この情報へのアクセスに役立つ help() 関数が組み込まれています。つまり、さらに詳しい情報が必要な場合は、ほぼいつでも help() を使用して必要な情報をすぐに見つけることができます。

例えば:

help(max)
Help on built-in function max in module builtins:

max(...)
    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value

    With a single iterable argument, return its biggest item. The
    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the largest argument.

追加情報へのアクセスは非常に便利であるため、IPython では、このドキュメントやその他の関連情報にアクセスするための短縮表現として ? 文字を使用します。IPython は、複数の言語で対話型コンピューティングを行うためのコマンド シェルです。

この表記法は、オブジェクトのメソッドやオブジェクト自体にも使用できます。

max?
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value

With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
Type:      builtin_function_or_method
a = np.array([1, 2, 3, 4, 5, 6])

そうすれば、多くの有用な情報を取得できます (最初に a 自体の詳細、次に a がインスタンスである narray の docstring)。

a?
Type:            ndarray
String form:     [1 2 3 4 5 6]
Length:          6
File:            ~/anaconda3/lib/python3.9/site-packages/numpy/__init__.py
Docstring:       <no docstring>
Class docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
        strides=None, order=None)

An array object represents a multidimensional, homogeneous array
of fixed-size items.  An associated data-type object describes the
format of each element in the array (its byte-order, how many bytes it
occupies in memory, whether it is an integer, a floating point number,
or something else, etc.)

Arrays should be constructed using `array`, `zeros` or `empty` (refer
to the See Also section below).  The parameters given here refer to
a low-level method (`ndarray(...)`) for instantiating an array.

For more information, refer to the `numpy` module and examine the
methods and attributes of an array.

Parameters
----------
(for the __new__ method; see Notes below)

shape : tuple of ints
        Shape of created array.
...

これは、作成する関数やその他のオブジェクトにも当てはまります。文字列リテラル (ドキュメントの前後に「""」「"" または ''' ''」) を使用して、関数にドキュメント文字列を含めることを忘れないでください。

たとえば関数を定義します

def double(a):
  '''Return a * 2'''
  return a * 2
double?
Signature: double(a)
Docstring: Return a * 2
File:      ~/Desktop/<ipython-input-23-b5adf20be596>
Type:      function

関心のあるオブジェクトのソース コードを読むと、別のレベルの情報を取得できます。二重疑問符 (??) を使用すると、ソース コードにアクセスできます。

例えば:

double??
Signature: double(a)
Source:
def double(a):
    '''Return a * 2'''
    return a * 2
File:      ~/Desktop/<ipython-input-23-b5adf20be596>
Type:      function

オブジェクトが Python 以外の言語でコンパイルされた場合、?? を使用すると、? と同じ情報が返されます。これは、次のような多くの組み込みオブジェクトや型で見られます。

len?
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method
len??
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

Python 以外のプログラミング言語でコンパイルされているため、出力は同じになります。

数式を使用する

配列に数式を実装するのが簡単であることが、NumPy が科学 Python コミュニティで広く使用されている理由の 1 つです。

たとえば、平均二乗誤差の式 (回帰を扱う教師あり機械学習モデルの中心的な式) は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-5giRRi5e-1691137027886)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/3ad18af4-7319-4c44-bf7c-02875ab6c7b6/Untitled.png)]

NumPy でのこの式の実装は簡単です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-530Ixsx2-1691137027886)(https://s3-us-west-2.amazonaws) .com/secure.notion - static.com/bddc2f0e-827f-4286-8aab-c365e732068b/Untitled.png)]

このアプローチが機能するのは、予測とラベルに 1 つまたは 1,000 の値を含めることができるためです。同じサイズである必要があるだけです。

次のように想像できます。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-65iipuST-1691137027886)(https://s3-us-west-2. amazonaws.com/secure.notion - static.com/36a2b694-406b-4c1e-9c6b-fb57ca1c4d85/Untitled.png)]

この例では、予測ベクトルとラベル ベクトルの両方に 3 つの値が含まれており、n の値が 3 であることを意味します。減算を行った後、ベクトル内の値が二乗されます。次に、NumPy はこれらの値を合計し、その結果がその予測の誤差値とモデルの品質のスコアになります。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7Tuitp46-1691137027886)(https://s3-us-west-2. amazonaws.com/secure.notion -static.com/d0f30102-fb5c-4c3c-80b6-4cee22e90ddd/Untitled.png)]

numpy オブジェクトを保存およびロードする方法

この部分では、np.save、np.savez、np.savetxt、np.load、np.loadtxt について説明します。

場合によっては、配列をディスクに保存し、コードを再実行せずにロードし直すことが必要な場合があります。幸いなことに、NumPy を使用してオブジェクトを保存およびロードする方法はいくつかあります。Narray オブジェクトは、loadtxt 関数と savetext 関数を使用してディスク ファイルに保存したりロードしたりできます。これらの関数はプレーン テキスト ファイルの処理に使用され、load 関数と save 関数は拡張子 .npy を持つ NumPy バイナリ ファイルの処理に使用され、savez 関数が使用されます。拡張子 . .npz のファイルを処理する NumPy ファイル。

.npy および .npz ファイルには、narray の再構築に必要なデータ、形状、dtype、その他の情報が保存されているため、ファイルが異なるアーキテクチャの別のマシン上にある場合でも、配列を正しく取得できます。

単一の nd`array オブジェクトを保存する場合は、np.save を使用してそれを .npy ファイルとして保存します。複数の narray オブジェクトを 1 つのファイルに保存する場合は、np.savez を使用して .npz ファイルとして保存します。savez_compressed を使用して、複数の配列を圧縮 npz 形式で単一のファイルに保存することもできます。

np.save() を使用すると、配列の保存とロードが簡単になります。保存する配列とファイル名を必ず指定してください。たとえば、次の配列を作成するとします。

a = np.array([1, 2, 3, 4, 5, 6])

ファイル名.npyとして保存できます

np.save('filename', a)

配列オブジェクトは、np.load() 関数を使用して再構築できます。

b = np.load('filename.npy')

np.savetext を使用すると、NumPy 配列を .csv や .txt ファイルなどのプレーン テキスト ファイルとして保存できます。

たとえば、配列を作成すると、

csv_arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

CSVファイルとして保存

np.savetxt('new_file.csv', csv_arr)

保存したテキスト ファイルからオブジェクトをロードします。loadtxt() を使用します。

np.loadtxt('new_file.csv')

savetext() 関数とloadtxt() 関数は、ヘッダー、フッター、区切り文字などの追加のオプションのパラメーターを受け入れます。テキスト ファイルは共有が簡単ですが、.npy および .npz ファイルはサイズが小さく、読み取りが速くなります。テキスト ファイルのより複雑な処理が必要な場合 (たとえば、欠損値を含む行を処理する必要がある場合)、genfromtxt 関数を使用する必要があります。

savetext を使用すると、ヘッダー、フッター、コメントなどを指定できます。

CSVファイルのインポートとエクスポート

既存の情報を含むCSVの読み込みは簡単です。最も簡単な方法は Pandas を使用することです。

Matplotlib を使用して配列をプロットする

値のプロットを生成する必要がある場合は、Matplotlib を使用すると非常に簡単です。

Guess you like

Origin blog.csdn.net/weixin_43547795/article/details/132107117