Python Numpy ライブラリの学習を簡単に始める

1 はじめに

1.1 NumPyとは何ですか?

NumPy は Python の科学技術計算の基本パッケージです。
つまり、さまざまな計算の中核は
NumPy はndarry オブジェクトです
NumPy 配列と標準の Python シーケンスの間には、いくつかの重要な違いがあります: (Python とのいくつかの違い)

NumPy 配列は、動的に増加する可能性がある Python リストとは異なり、作成時に固定サイズになります。ndarray のサイズを変更すると、新しい配列が作成され、元の配列は削除されます。
NumPy 配列内の要素はすべて同じデータ型である必要があり、したがってメモリ内で同じサイズである必要があります。例外: (NumPy を含む Python) オブジェクトの配列が存在する可能性があるため、異なるサイズの要素の配列が許可されます。
NumPy 配列は、大量のデータに対する高度な数学演算やその他の種類の演算を容易にします。一般に、このような操作は、Python の組み込みシーケンスを使用するよりも効率的に実行され、必要なコードが少なくなります。
NumPy 配列を使用する科学的および数学的な Python ベースのパッケージが増えています。これらは多くの場合 Python シーケンス入力をサポートしますが、処理前にこれらの入力を NumPy 配列に変換し、NumPy 配列を出力することがよくあります。言い換えれば、今日の Python ベースの科学/数学ソフトウェアを効果的に使用するには、Python の組み込みシーケンス型の使用方法を知るだけでは十分ではなく、NumPy 配列の使用方法も知る必要があります。

Numpy では、ndarray が含まれる場合、要素ごとの演算が「デフォルト モード」になります [配列が含まれる場合、対応する要素の乗算がデフォルトの形式になります]

c = a * b

1.2 NumPy はなぜ速いのですか?

ベクトル化 [ベクトル化]
ブロードキャスト [放送の仕組み]

2 NumPy クイックスタート

2.1 基本

NumPy の主要オブジェクトは同じ構造の多次元配列です
これは、負でない整数のタプルによってインデックス付けされた、同じタイプ (通常は数値) の要素のテーブルです。
NumPy では、dimensions軸は次のように呼ばれます。axes

[1, 2, 1]	# one axis,a length of 3
# the array has 2 axes,he first axis has a length of 2, the second axis has a length of 3.第一个维度是行,第二个维度是列
[[1., 0., 0.],
 [0., 1., 2.]]

NumPyの配列クラスが呼び出されますndarray
注意:numpy.array標準 Python ライブラリ クラスとは異なりますarray.array
Python は、オブジェクトの 1 次元配列の重要な属性array.arrayのみを処理できます。
ndarray

# 1 ndarray.ndim:the number of axes (dimensions) of the array【维度的数量】
# 2 ndarray.shape:the dimensions of the array.This is a tuple of integers indicating the size of the array in each dimension. 
For a matrix with n rows and m columns, shape will be (n,m). The length of the shape tuple is therefore the number of axes, ndim.
【数组的维度。这是一个整数元组,表示每个维度中数组的大小。
对于一个有n行m列的矩阵,shape将是(n,m)
因此,the shape tuple的长度就是轴的数量ndim】
# 3 ndarray.size:the total number of elements of the array. 
This is equal to the product of the elements of shape.
【数组中所有元素的个数,等于array shape所有元素的乘积】
# 4 ndarray.dtype:an object describing the type of the elements in the array.
One can create or specify dtype’s using standard Python types. 
Additionally NumPy provides types of its own. numpy.int32, numpy.int16, and numpy.float64 are some examples.
【描述数组中元素类型的对象
可以使用标准Python类型创建或指定dtype。
此外,NumPy还提供了自己的类型。比如numpy.int32、numpy.int16和numpy.float64】
# 4 ndarray.itemsize:the size in bytes of each element of the array.
For example, an array of elements of type float64 has itemsize 8 (=64/8),
while one of type complex32 has itemsize 4 (=32/8).
It is equivalent to 【ndarray.dtype.itemsize】
【数组中每个元素的大小(以字节为单位)。
例如,float64类型(64 bit)的元素数组的项大小为8(=64/8),
而complex32(32 bit)类型的元素阵列的项大小是4(=32/8)
它相当于ndarray.dtype.itemsize】
# 5 ndarray.data:the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because we will access the elements in an array using indexing facilities.
【该缓冲区包含数组的实际元素。
通常,我们不需要使用此属性,因为我们将使用索引功能访问数组中的元素。】

2.1.1 例

import numpy as np
a = np.arange(15).reshape(3, 5)
print(a)
print(a.shape)
print(a.ndim)
print(a.size)
print(a.dtype)

ここに画像の説明を挿入

type(a)
# numpy.ndarray
b = np.array([3,4,5])
type(b)
# numpy.ndarray

2.1.2 配列の作成 [配列の作成]

新しい配列を作成するにはいくつかの方法があります。

  • array()関数を使用して、通常の Python リストまたはタプルから配列を作成しますシーケンス内の要素の型から推定される配列の型
import numpy as np
a = np.array([2, 3, 4])		# [2, 3, 4]是一个列表
a 
a.dtype

よくある間違いは、単一のシーケンスをパラメーターとして指定する代わりに、複数のパラメーターを含む配列を呼び出すことです [リストを使用する場合は、角括弧 [] を忘れないでください]

a = np.array(1, 2, 3, 4)    # WRONG
Traceback (most recent call last):
  ...
TypeError: array() takes from 1 to 2 positional arguments but 4 were given
a = np.array([1, 2, 3, 4])  # RIGHT

array()シーケンスのシーケンス [シーケンスのシーケンス] は2 次元配列に変換できますシーケンスのシーケンスのシーケンス [シーケンスのシーケンスのシーケンス] は 3 次元
配列に変換できます

b = np.array([(1,2,3),(4,5,6)])	# 最外面是方括号[],一个列表中包含了两个元组
b
array([[1, 2, 3],
    [4, 5, 6]])

同時に配列型の変換も可能

c = np.array([[1, 2], [3, 4]], dtype=complex)
c
array([[1.+0.j, 2.+0.j],
       [3.+0.j, 4.+0.j]])

多くの場合、配列の要素は最初は不明ですが、そのサイズはわかっています。
したがって、NumPy には、初期のプレースホルダーの内容を含む配列を作成するためのいくつかの関数が用意されています。

# zeros:creates an array full of zeros【全是0】
# ones:creates an array full of ones【全是1】
# empty:initial content is random,depends on the state of the memory【初始内容随机,取决于内存的状态】
# 默认,the dtype of the created array is float64,但可以通过关键字dtype进行更改

a = np.zeros((2,5))
a
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
b = np.ones((2,3,5), dtype=np.int16)
b
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, 1],
        [1, 1, 1, 1, 1]]], dtype=int16)
c = np.empty((2,4))
c
array([[0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
        0.00000000e+000],
       [0.00000000e+000, 8.61650486e-321, 1.78019082e-306,
        8.90103559e-307]])

一連の数値を作成するには、arange(Python の range と同様) を使用しますが、arange配列を返します。

a = np.arange(10,30,5)	# 10是start,30是end,5是interval【间隔】
a
array([10, 15, 20, 25])
b = np.arange(0,2,0.6)	# end可以不达到,interval可以是小数
b
array([0. , 0.6, 1.2, 1.8])

浮動小数点パラメータと一緒に使用するとarange、最終的な配列の要素数はあまり予測できません。
そのためlinspace、配列の要素数を設定できるようにすることをお勧めします。

from numpy import pi
a = np.linspace(0,2,9)	# 从0到2的9个数,包括0和2,均匀分配
a
array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])

2.1.3 配列の印刷【配列の印刷】

配列を出力するとき、NumPy は入れ子になったリストと同様の方法で配列を表示します (リストと同様)

最後の軸は左から右に印刷されます [1 行を左から右に読み取ります] 最後から 2 番目の
軸は上から下に印刷されます [列を上から下に読み取ります]
残りも上から下に印刷され、各スライスは空白行で次のスライスと区切られます 1 次元配列は行として印刷されます [行] 2 次元配列は行列として印刷されます [行列] 3 次元配列は行列のリストとして印刷


ます

Numpy にすべての配列を強制的に印刷させたい場合は、np.set_printoptions変更印刷オプションを使用します。

# 全部输出
np.set_printoptions(threshold=sys.maxsize)  # sys module should be imported

2.1.4 基本操作

配列操作は要素ごとに[要素ごとに] 実行され、新しい配列が作成されます

a = np.array([20, 30, 40, 50])
b = np.arange(4)
b
c = a - b

多くの行列言語とは異なり、積演算子は*NumPy 配列を要素ごとに操作します
行列積行列積が使用できる関数@运算符(在python中>=3.5)またはdotメソッド

a = np.array([[1,1],[0,1]])
b = np.array([[2,0],[3,4]])

print(a*b)	# 对应元素相乘
print(a@b)	# 矩阵乘法
print(a.dot(b))	# 矩阵乘法
# 结果如下:
[[2 0]
 [0 4]]
[[5 4]
 [3 4]]
[[5 4]
 [3 4]]

+=または などのこれらの操作は、*=新しい配列を作成せずに元の配列を直接処理します。

rg = np.random.default_rng(1)	# 设置随机树生成器,数字可以更改
a = np.ones((2, 3), dtype=int)
print(a)
[[1 1 1]
 [1 1 1]]
b = rg.random((2,3))
[[0.51182162 0.9504637  0.14415961]
 [0.94864945 0.31183145 0.42332645]]
print(b)
b +=a	# 对b进行处理,等同于b=b+a
print(b)
[[1.51182162 1.9504637  1.14415961]
 [1.94864945 1.31183145 1.42332645]]
 # 但是a = a + b,b不能自动从float转为int
 a += b
 # UFuncTypeError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int32') with casting rule 'same_kind'

異なる型の配列を操作する場合、結果の配列の型は、より一般的なまたは正確な型に対応します (アップキャストと呼ばれる動作)。

a = np.ones(3, dtype=np.int32)	# 'int32'
b = np.linspace(0, pi, 3)
b.dtype.name	# 'float64'
c = a + b
c.dtype.name	# 'float64'

配列内のすべての要素の合計の計算など、多くの単項演算はndarrayクラスのメソッドとして実装されます。

a = rg.random((2,3))
print(a)
print(a.sum())
print(a.max())
print(a.min())
# 结果如下:
[[0.32973172 0.7884287  0.30319483]
 [0.45349789 0.1340417  0.40311299]]
2.412007822394087
0.7884287034284043
0.13404169724716475

デフォルトでは、これらの操作は、配列の形状に関係なく、あたかも数値のリスト [数値のリスト] であるかのように配列に適用されます。ただし、パラメーターを指定することで、指定した配列に沿って操作を適用
できますaxisaxis
axis=0: 列を処理します
axis=1: 行を処理します

# 指定轴参数axis
b = np.arange(12).reshape(3,4)
print(b)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
print(b.sum(axis=0))	# 每列求和
[12 15 18 21]
print(b.min(axis=1))	# 每行求最小
[0 4 8]
print(b.cumsum(axis=1))	# 每行元素依次累加,得到和原来完全相同的数组
[[ 0  1  3  6]
 [ 4  9 15 22]
 [ 8 17 27 38]]
print(b.cumsum(axis=0))	# 每列元素依次累加,得到和原来完全相同的数组
[[ 0  1  2  3]
 [ 4  6  8 10]
 [12 15 18 21]]

2.1.5 ユニバーサル機能【共通機能】

NumPy は、sin、cos、exp などのよく知られた数学関数を提供します。これらの関数は、これらの関数を使用するときに要素ごとに動作し、出力として配列を生成するよう
に Numpy で設定されます。universal functions(ufunc)

b = np.arange(3)
print(np.exp(b))
[1.         2.71828183 7.3890561 ]
print(np.sqrt(b))
[0.         1.         1.41421356]

2.1.6 インデックス付け、スライス、反復【インデックス付け、スライス、反復】

1 次元配列は、lists and other Python sequences次のようにインデックス付け、スライス、反復が可能です。

a = np.arange(10)**3	# **是幂的意思
print(a)
[  0   1   8  27  64 125 216 343 512 729]
print(a[2])		# 从0开始
8
print(a[2:5])	# 切片
[ 8 27 64]
a[:6:2] = 1000	# 从开始到索引6(不包括索引6),间隔为2,每隔2个元素设置为1000
print(a)
[1000    1 1000   27 1000  125  216  343  512  729]
print(a[::-1])	# 两个冒号代表从开始到结尾|将数组a反转,注意,对a本身没有什么影响,除非重新赋值一个新数组
[ 729  512  343  216  125 1000   27 1000    1 1000]

多次元配列には、軸ごとに 1 つのインデックスを含めることができます。これらのインデックスは、カンマ区切りのタプルとして指定されます。

def f(x,y):
    return 10*x+y

# fromfunction():通过f,创建特定的数组
b = np.fromfunction(f, (5, 4), dtype=int)	# (5,4)指数组的shape,x从0-4,y从0-3
b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
print(b[2,3])
print(b[0:5, 1])	# 0-5(不包括5)行,第2列
print(b[:, 1])	# 所有行,第2列
print(b[1:3, :] )	# 所有列,1-3行

指定されたインデックスが軸の数よりも少ない場合、欠落しているインデックスは完全なスライスとして扱われます。つまり、 [最後の列、すべての行]
b[-1]と同等です。b[-1, :]

b[i]的i后面可以跟冒号:或者dots...

dots(…) は、完全なインデックス タプルを生成するために必要なコロンを表します
。つまり、必要なコロンを…に渡します。

# if x is an array with 5 axes
x[1, 2, ...] is equivalent to x[1, 2, :, :, :],
x[..., 3] to x[:, :, :, :, 3] and
x[4, ..., 5, :] to x[4, :, :, 5, :]
# 例子
c = np.array([[[  0,  1,  2],  # a 3D array (two stacked 2D arrays)
               [ 10, 12, 13]],
              [[100, 101, 102],
               [110, 112, 113]]])
print(c)
[[[  0   1   2]
  [ 10  12  13]]
 [[100 101 102]
  [110 112 113]]]
print(c.shape)	# (2, 2, 3)
print(c[1,...])	# same as c[1, :, :] or c[1]【第二个块】
[[100 101 102]
 [110 112 113]]
print(c[...,2])	# same as c[:, :, 2]【第3列】
[[  2  13]
 [102 113]]

多次元配列の反復は、最初の軸を基準にして行われます。

def f(x,y):
    return 10*x+y
b = np.fromfunction(f, (5, 4), dtype=int)	# (5,4)指数组的shape,x从0-4,y从0-3
b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
for row in b:
    print(row)	# 按行读取
# 结果如下:
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]

ただし、配列の各要素に対して演算を実行したい場合は、flat配列のすべての要素に対する反復子である Spread プロパティを使用できます。

for element in b.flat:
    print(element)
# 结果
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43

2.2 形状操作【形状管理】

2.2.1 配列の形状を変更する

配列の形状は、各軸に沿った要素の数によって与えられます。

rg = np.random.default_rng(1)
a = np.floor(10*rg.random((3,4)))	# 下取整
a
array([[5., 9., 1., 9.],
       [3., 4., 8., 4.],
       [5., 0., 7., 5.]])
a.shape
(3, 4)

配列の形状はさまざまなコマンドで変更できます。次の 3 つのコマンドはすべて、変更された配列を返しますが、元の配列は変更しないことに注意してください。

print(a.ravel(),a.ravel().shape)	# 展开flattened

print(a.reshape(6, 2))	# 6行2列,进行形状重设,各维度的乘积需保持不变
[[5. 9.]
 [1. 9.]
 [3. 4.]
 [8. 4.]
 [5. 0.]
 [7. 5.]]
print(a.T, a.T.shape)	# 转置[4,3]
[[5. 3. 5.]
 [9. 4. 0.]
 [1. 8. 7.]
 [9. 4. 5.]] 
 (4, 3)

ndarray.resize配列自体を変更するメソッド【自身の形状を変更する】

a.resize((2,6))
a

上記でreshape、-1 が表示されている場合、寸法のサイズは自動的に計算されます

a.reshape(3, -1)
# 3行,自动计算列数12/3=4列

2.2.2 異なるアレイをスタックする

複数の配列を異なる軸に沿って積み重ねることができます。

  • vstack(): [行が積み上げられ、行数が増加します]
  • hstack(): [列が積み上げられ、列数が増加します]
a = np.floor(10 * rg.random((2, 2)))
b = np.floor(10 * rg.random((2, 2)))
print(a)
[[5. 9.]
 [1. 9.]]
print(b)
[[3. 4.]
 [8. 4.]]
c = np.vstack((a, b))	# vstack进行行堆叠
print(c)
[[5. 9.]
 [1. 9.]
 [3. 4.]
 [8. 4.]]
d = np.hstack((a, b))	# hstack进行列堆叠
[[5. 9. 3. 4.]
 [1. 9. 8. 4.]]
print(d)
  • column_stack(): [1D 配列の場合は列ごとにスタックします - 列の数が増加します。これは hstack() とは異なります] [2D 配列の場合は hstack() と同じです]
  • row_stack(): [行のスタッキング]

関数の場合column_stack: 1D 配列を列ごとに 2D 配列にスタックします

# column_stack对于二维数组而言,进行列的堆叠
e = np.column_stack((a, b))
[[5. 9. 3. 4.]
 [1. 9. 8. 4.]]
 
a = np.array([4., 2.])
b = np.array([3., 8.])
c = np.column_stack((a, b)) # column_stack对于一维数组而言,将一维数据看作列,返回二维数组
[[4. 3.]
 [2. 8.]]
d = np.hstack((a, b))	# 由于a和b都只有一列,生成的d也是一列
print(d)
 [4. 2. 3. 8.]

利用newaxis

from numpy import newaxis

a = np.array([4., 2.])
a = a[:, newaxis]	# 将a看作一个2维的矢量
array([[4.],
       [2.]])	# 4外面存在两个中括号
c = np.column_stack((a[:, newaxis], b[:, newaxis]))	# 按照列堆叠
array([[4., 3.],
       [2., 8.]])
d = np.hstack((a[:, newaxis], b[:, newaxis]))	# 按照行堆叠
d
array([[4., 3.],
       [2., 8.]])
# 上述两种方法结果一样

function の場合、row_stack他の入力配列の場合vstackと同じです
。実際、 row_stack は vstack のエイリアスです。

np.column_stack is np.hstack
False	# 两者不相同
np.row_stack is np.vstack
True	# 两者相同

要約すると、2 次元以上の配列の場合、
hstack2 番目の軸に沿ってスタック [水平]
vstack最初の軸に沿ってスタック [垂直]
concatenate指定された番号付きの軸を接続します。

注: 複雑な場合は、 1 つの軸に沿って数値をスタックすることで配列を作成するr_ためc_に使用できます。範囲リテラルの使用が許可されます。

a = np.r_[1:4, 0, 4]
a
array([1, 2, 3, 0, 4])

# hstack, vstack, column_stack, concatenate, c_, r_ 这些比较类似

配列の引数として使用すると、r_とのc_デフォルト動作vstackと同様に動作しますhstackが、結合する軸の番号を指定するオプションの引数を許可します

2.2.3 1つの配列を複数の小さな配列に分割する【配列分割】

hsplit配列は水平軸に沿って分割できます (方法 1: 返す等しい形状の配列の数を指定します | 方法 2: 分割する列を指定します)

a = np.floor(10 * rg.random((2, 12)))
print(a)
[[5. 9. 1. 9. 3. 4. 8. 4. 5. 0. 7. 5.]
 [3. 7. 3. 4. 1. 4. 2. 2. 7. 2. 4. 9.]]
b = np.hsplit(a,3)	# 按照列进行分割,分为3份
print(b)
[array([[5., 9., 1., 9.],[3., 7., 3., 4.]]), 
array([[3., 4., 8., 4.],[1., 4., 2., 2.]]), 
array([[5., 0., 7., 5.],[7., 2., 4., 9.]])]
c = np.hsplit(a, (3, 4))	# 指定要分割的列通过括号实现,在第3列和第4列分别进行分割【第3列之前|3-4列|第4列之后,总共分为3份】
print(c)
[array([[5., 9., 1.],[3., 7., 3.]]), 
array([[9.],[4.]]), 
array([[3., 4., 8., 4., 5., 0., 7., 5.],[1., 4., 2., 2., 7., 2., 4., 9.]])]

vsplit垂直軸 [vertical axis] に沿って分割すると、
array_split分割する特定の軸を選択できます。

2.3 コピーと閲覧【コピー】

配列を操作したり操作したりすると、そのデータが新しい配列にコピーされる場合とコピーされない場合があります。次の 3 つのケースがあります。

2.3.1 一切のコピーを禁止【コピー禁止】

オブジェクトやそのデータがコピーされないことを指定するだけです

a = np.array([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11]])
b = a	# 没有创建新的object
True
b is a	# a和b是同一数组object的两个命名

2.3.2 表示または浅いコピー [浅いコピー]

異なる配列オブジェクトは同じデータを共有できます。viewメソッドは、同じデータを表示するための新しい配列オブジェクトを作成します

c = a.view()
c is a	# c和a不同
False

2.3.3 ディープコピー[ディープコピー]

copyメソッドは配列とデータの完全なコピーを実行します

d = a.copy()	# 包括新数据的新数组被创建
d is a	# d和a不共享任何数据
False

2.3.4 関数とメソッドの概要 【関数とメソッドの概要】

2.4 基本的ではない

2.4.1 放送ルール[放送原則]

ブロードキャストにより、汎用関数がまったく同じ形状ではない入力を意味のある方法で処理できるようになります。

  • 最初のルール:すべての入力配列の次元が異なる場合、すべての配列の次元が同じになるまで、小さい方の配列の形状に「1」が繰り返し追加されます
  • 2 番目のルール:特定の次元に沿ったサイズ 1 の配列が、その次元に沿った最大の形状を持つ配列のサイズであるかのように動作することを保証します。配列要素の値は、「ブロードキャスト」配列の次元と同じであると想定されます。

ブロードキャスト ルールが適用された後は、すべての配列のサイズが一致する必要があります

2.5 高度なインデックス作成とインデックスのトリック

NumPy は、通常の Python シーケンスよりも多くのインデックス機能を提供します。
前に見たように、整数とスライスによるインデックス付けに加えて、配列は整数とブール値の配列によってインデックス付けすることもできます。

2.5.1 インデックスの配列によるインデックス付け [配列インデックス]

a = np.arange(12)**2
i = np.array([1, 1, 3, 8, 5]) 	# 索引构成的数组
a[i]	# i指数组的下标
array([ 1,  1,  9, 64, 25], dtype=int32)
j = np.array([[3, 4], [9, 7]])	# 二维数组
a[j]	# 得到的数组与j的shape相同
array([[ 9, 16],
       [81, 49]], dtype=int32)

インデックス配列 a が多次元の場合、単一のインデックス配列は a の最初の次元を参照します。 次の
例は、カラー パレットを使用してラベル イメージをカラー イメージに変換することによるこの動作を示しています。

# 调色板
palette = np.array([[0, 0, 0],         # black
                    [255, 0, 0],       # red
                    [0, 255, 0],       # green
                    [0, 0, 255],       # blue
                    [255, 255, 255]]) 	# black
image = np.array([[0, 1, 2, 0], 
                  [0, 3, 4, 0]])	# 相当于索引数组(2, 4),每个数字代表调色板上的颜色
palette[image]	# 得到的结果与image的shape相同,并且由于palette内每个元素是三维,最终数组shape为(2, 4, 3)
array([[[  0,   0,   0],
        [255,   0,   0],
        [  0, 255,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0,   0, 255],
        [255, 255, 255],
        [  0,   0,   0]]])

[複数の次元] のインデックスを提供することも可能です。ただし、各次元のインデックス配列は同じ形状でなければなりません。

a = np.arange(12).reshape(3, 4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
i = np.array([[0, 1], [1, 2]]) # indices for the first dim of `a`【a的第一个维度的索引】
j = np.array([[2, 1], [3, 3]]) # indices for the second dim of `a`【a的第二个维度的索引】
a[i,j]	# i和j的shape必须相同
array([[ 2,  5],
       [ 7, 11]])
a[i, 2]
array([[ 2,  6],
       [ 6, 10]])
a[:, j]
array([[[ 2,  1],
        [ 3,  3]],

       [[ 6,  5],
        [ 7,  7]],

       [[10,  9],
        [11, 11]]])

Python では、arr[i,j]arr[(i,j)]まったく同じなので、i と j をタプルに入れて、それをインデックス付けに使用できます。ただし、i と j を括弧 () の中に入れることはできません [この配列はインデックス a の最初の次元として解釈されるためです。

l = (i, j)	# 新建元组
a[l]	# 与a[i, j]相同

配列によるインデックス付けのもう 1 つの一般的な用途は、時系列の最大値を検索することです。

argmax(a, axis=None, out=None)
使用法: 最大値に対応するインデックス値を返します。1
次元配列と 2 次元配列の両方が使用可能です。2
次元配列の場合: axis=0: 配列の列方向の最大値を検索|axis=1: 配列の行方向の最大値を検索

time = np.linspace(20, 145, 5) # 时间序列
data = np.sin(np.arange(20)).reshape(5, 4)	# 数据,5行4列
data
ind = data.argmax(axis=0)	# 得到列方向最大值所对应的索引【得到的其实是行号】
ind
time_max = time[ind]	# 得到数据最大值所对应的时间
data_max = data[ind, range(data.shape[1])] 	# 得到最大值

データを割り当てるターゲットのインデックスとして配列を使用することもできます。

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

ただし、インデックス リストに重複が含まれている場合は、複数の割り当てが実行され、最後の値のみが保持されます。

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

2.5.2 ブール配列によるインデックス付け【ブール配列】

(整数) インデックス配列を使用して配列にインデックスを付けると、選択できるインデックスのリストが提供されます。
ブール型インデックスの場合は方法が異なります; 配列内の [必要な項目] と [不要な項目] を明示的に選択する必要があります 最初の方法: [元の配列と同じ形状のブール配列を使用する

]

a = np.arange(12).reshape(3, 4)
b = a > 4	# 返回布尔数组
b
array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]])

a[b]	# False的舍弃,只保留True的
array([ 5,  6,  7,  8,  9, 10, 11])
a[b]=0 # 将对的数据变为0
a
array([[0, 1, 2, 3],
       [4, 0, 0, 0],
       [0, 0, 0, 0]])

2 番目の方法: 整数のインデックス付けに似ています。配列の各次元に対して、1D ブール配列が与えられ、必要なスライスを選択します。1D ブール配列の長さは、スライスされる次元 (または
軸) の長さと一致する必要があることに注意してください。

a = np.arange(12).reshape(3, 4)
b1 = np.array([False, True, True])	# b1长度为3(a中的行数)
b2 = np.array([True, False, True, False])	# b2长度为4(a中的列数)

a[b1, :]	# 选择行
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a[b1]  # 依旧是选择行
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a[:, b2] # 选择列 
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])

2.5.3 ix_() 関数 [あまり役に立ちません]

このix_関数を使用すると、異なるベクトルを結合して、各 n-uplet の結果を取得できます。たとえば、ベクトル a、b、c のそれぞれから取得したすべての 3 つの要素について、すべての a+b*c を計算したい場合、

2.5.4 Indexing with strings【省略】

2.6 コツとヒント [ヒント]

2.6.1 「自動」整形【自動変形】

配列の次元を変更するには、形状の 1 つを省略でき、その形状は自動的に推定されます。

a = np.arange(30)
b = a.reshape((2, -1, 3)) 
b.shape
(2, 5, 3)
b
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11],
        [12, 13, 14]],

       [[15, 16, 17],
        [18, 19, 20],
        [21, 22, 23],
        [24, 25, 26],
        [27, 28, 29]]])

2.6.2 ベクトルスタッキング [ベクトルスタッキング]

同じサイズの行ベクトルのリストから 2D 配列を構築するにはどうすればよいでしょうか? MATLAB では、これは簡単です。x と y が同じ長さの 2 つのベクトルの場合は、 m=[x;y] を実行するだけです。
NumPy では、これはcolumn_stack、dstack、hstack和vstackスタックされる次元に応じて関数で実現されます。

x = np.arange(0, 10, 2)
y = np.arange(5)
m = np.vstack([x, y])	# 按行堆叠
m
array([[0, 2, 4, 6, 8],
       [0, 1, 2, 3, 4]])
xy = np.hstack([x, y])	# 按列
xy
array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])

2.6.3 ヒストグラム

histogram配列に適用されたNumPy関数は、次のベクトルのペアを返します: [配列のヒストグラムとビン エッジのベクトル]
注: matplotlib には、ヒストグラムを作成する関数 ( Matlab で呼び出されますhist) もありますが、これは NumPy のものとは異なります。
主な違いは、pylab.histヒストグラムが自動的に描画されるのに対し、numpy.histogramデータのみが生成されることです。

import numpy as np
rg = np.random.default_rng(1)
import matplotlib.pyplot as plt
# Build a vector of 10000 normal deviates with variance 0.5^2 and mean 2
mu, sigma = 2, 0.5
v = rg.normal(mu, sigma, 10000)
# Plot a normalized histogram with 50 bins
plt.hist(v, bins=50, density=True)       # matplotlib version (plot)
(array...)
# Compute the histogram with numpy and then plot it
(n, bins) = np.histogram(v, bins=50, density=True)  # NumPy version (no plot)
plt.plot(.5 * (bins[1:] + bins[:-1]), n) # bins[1:]指从第一个数据到最后一个数据,bins[:-1]指从第0个数据到倒数第二个数据,前后两个bin的值求平均

ここに画像の説明を挿入


参考リンク:

おすすめ

転載: blog.csdn.net/weixin_45913084/article/details/130135779