初心者がすぐに始めるのに適した Numpy 実践演習の完全なコレクション

初心者がすぐに始めるのに適した Numpy 実践演習の完全なコレクション

Numpy は、Python で実装された科学計算用の拡張ライブラリであり、次のものが含まれます。

  • 1. 強力な N 次元配列オブジェクト Array。
  • 2. 比較的成熟した (ブロードキャスト) 関数ライブラリ。
  • 3. C/C++ および Fortran コードを統合するためのツールキット。
  • 4. 実践的な線形代数、フーリエ変換、乱数生成機能。疎行列演算パッケージ scipy と一緒に numpy を使用すると便利です。

NumPy (Numeric Python) は、行列データ型、ベクトル処理、高度な算術ライブラリなど、多くの高度な数値プログラミング ツールを提供します。厳密な数値処理のために構築されています。これは主に多くの大手金融会社や、ローレンス リバモアなどの中核的な科学技術コンピューティング組織で使用されており、NASA は元々 C++、Fortran、または Matlab を使用して実行されていた一部のタスクを処理するためにこれを使用しています。

この記事の内容

1.Numpyの基本操作

1.1 リストを行列に変換する

1.2 寸法

1.3 行数と列数 ()

1.4 要素の数

2.Numpyは配列を作成します

2.1 1次元配列の作成

2.2 多次元配列の作成

2.3 すべてゼロの配列を作成する

2.4 全1データの作成

2.5 完全に空の配列を作成する

2.6 連続配列の作成

2.7 整形操作

2.8 連続データの作成

2.9 linspace の再形成操作

3.Numpyの基本操作

3.1 1 次元行列演算

3.2 多次元行列演算

3.3 基本的な計算

4.Numpyのインデックス作成とスライス

5.Numpy配列のマージ

5.1 配列の結合

5.2 配列を行列に転置する

5.3 複数の行列の結合

5.4 マージ例 2

6.Numpy array分割

6.1 3 行 4 列の行列を作成する

6.2 等分割

6.3 不等分割

6.4 他のセグメンテーション方法

7.Numpy コピーと =

7.1 =割り当て方法は結合型になります

7.2 copy() 代入メソッドには関連性がない

8.ブロードキャストの仕組み

9. よく使う機能

1.Numpyの基本操作

1.1 リストを行列に変換する

import numpy as np
array = np.array([
    [1,3,5],
    [4,6,9]
])

print(array)
[[1 3 5]
 [4 6 9]]

1.2 寸法

print('number of dim:', array.ndim)
number of dim: 2

1.3 行数と列数 ()

print('shape:',array.shape)
shape: (2, 3)

1.4 要素の数

print('size:',array.size)
size: 6

2.Numpyは配列を作成します

2.1 1次元配列の作成

import numpy as np
# 一维array
a = np.array([2,23,4], dtype=np.int32) # np.int默认为int32
print(a)
print(a.dtype)
[ 2 23  4]
int32

2.2 多次元配列の作成

# 多维array
a = np.array([[2,3,4],
              [3,4,5]])
print(a) # 生成2行3列的矩阵
[[2 3 4]
 [3 4 5]]

2.3 すべてゼロの配列を作成する

a = np.zeros((3,4))
print(a) # 生成3行4列的全零矩阵
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

2.4 全1データの作成

# 创建全一数据,同时指定数据类型
a = np.ones((3,4),dtype=np.int)
print(a)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]


C:\Users\48125\AppData\Local\Temp\ipykernel_18880\1001327096.py:2: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  a = np.ones((3,4),dtype=np.int)

2.5 完全に空の配列を作成する

# 创建全空数组,其实每个值都是接近于零的数
a = np.empty((3,4))
print(a)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

2.6 連続配列の作成

# 创建连续数组
a = np.arange(10,21,2) # 10-20的数据,步长为2
print(a)
[10 12 14 16 18 20]

2.7 整形操作

# 使用reshape改变上述数据的形状
b = a.reshape((2,3))
print(b)
[[10 12 14]
 [16 18 20]]

2.8 連続データの作成

# 创建线段型数据
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段
print(a)
[ 1.          1.47368421  1.94736842  2.42105263  2.89473684  3.36842105
  3.84210526  4.31578947  4.78947368  5.26315789  5.73684211  6.21052632
  6.68421053  7.15789474  7.63157895  8.10526316  8.57894737  9.05263158
  9.52631579 10.        ]

2.9 linspace の再形成操作

# 同时也可以reshape
b = a.reshape((5,4))
print(b)
[[ 1.          1.47368421  1.94736842  2.42105263]
 [ 2.89473684  3.36842105  3.84210526  4.31578947]
 [ 4.78947368  5.26315789  5.73684211  6.21052632]
 [ 6.68421053  7.15789474  7.63157895  8.10526316]
 [ 8.57894737  9.05263158  9.52631579 10.        ]]

3.Numpyの基本操作

3.1 1 次元行列演算

import numpy as np
# 一维矩阵运算
a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b)
[10 20 30 40] [0 1 2 3]
c = a - b
print(c)
[10 19 28 37]
print(a*b) # 若用a.dot(b),则为各维之和
[  0  20  60 120]
# 在Numpy中,想要求出矩阵中各个元素的乘方需要依赖双星符号 **,以二次方举例,即:
c = b**2
print(c)
[0 1 4 9]
# Numpy中具有很多的数学函数工具
c = np.sin(a)
print(c)
[-0.54402111  0.91294525 -0.98803162  0.74511316]
print(b<2)
[ True  True False False]
a = np.array([1,1,4,3])
b = np.arange(4)
print(a==b)
[False  True False  True]

3.2 多次元行列演算

a = np.array([[1,1],[0,1]])
b = np.arange(4).reshape((2,2))
print(a)
[[1 1]
 [0 1]]
print(b)
[[0 1]
 [2 3]]
# 多维度矩阵乘法
# 第一种乘法方式:
c = a.dot(b)
print(c)
[[2 4]
 [2 3]]
# 第二种乘法:
c = np.dot(a,b)
print(c)
[[2 4]
 [2 3]]
# 多维矩阵乘法不能直接使用'*'号

a = np.random.random((2,4))

print(np.sum(a)) 
4.566073674715756
print(np.min(a))
0.28530553227025357
print(np.max(a))
0.8647092701217907
print("a=",a)
a= [[0.28530553 0.4239227  0.82876104 0.64553364]
 [0.43444521 0.35855996 0.72483633 0.86470927]]

行または列に対して検索操作を実行する必要がある場合は、

上記のコードでは、軸に値を割り当てる必要があります。

軸の値が 0 の場合、その列が検索単位として使用されます。

axis の値が 1 の場合、行が検索単位として使用されます。

print("sum=",np.sum(a,axis=1))
sum= [2.18352291 2.38255077]
print("min=",np.min(a,axis=0))
min= [0.28530553 0.35855996 0.72483633 0.64553364]
print("max=",np.max(a,axis=1))
max= [0.82876104 0.86470927]

3.3 基本的な計算

import numpy as np

A = np.arange(2,14).reshape((3,4))
print(A)
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
# 最小元素索引
print(np.argmin(A)) # 0
0
# 最大元素索引
print(np.argmax(A)) # 11
11
# 求整个矩阵的均值
print(np.mean(A)) # 7.5
7.5
print(np.average(A)) # 7.5
7.5
print(A.mean()) # 7.5
7.5
# 中位数
print(np.median(A)) # 7.5
7.5
# 累加
print(np.cumsum(A))
[ 2  5  9 14 20 27 35 44 54 65 77 90]
# 累差运算
B = np.array([[3,5,9],
              [4,8,10]])
print(np.diff(B))
[[2 4]
 [4 2]]
C = np.array([[0,5,9],
              [4,0,10]])
print(np.nonzero(B))
print(np.nonzero(C))
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
(array([0, 0, 1, 1], dtype=int64), array([1, 2, 0, 2], dtype=int64))
# 仿照列表排序
A = np.arange(14,2,-1).reshape((3,4)) # -1表示反向递减一个步长
print(A)
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
print(np.sort(A))
[[11 12 13 14]
 [ 7  8  9 10]
 [ 3  4  5  6]]
# 矩阵转置
print(np.transpose(A))
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]
print(A.T)
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]
print(A)
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
print(np.clip(A,5,9))
[[9 9 9 9]
 [9 9 8 7]
 [6 5 5 5]]

クリップ(配列,配列_最小,配列_最大)

Array_min<X<Array_max X を行列 A の数値として表します。上記の関係が満たされる場合、元の数値は変わりません。

それ以外の場合、X<Array_min の場合、行列の X を Array_min に変更します。

X>Array_max の場合、行列の X を Array_max に変更します。

4.Numpyのインデックス作成とスライス

import numpy as np
A = np.arange(3,15)
print(A)
[ 3  4  5  6  7  8  9 10 11 12 13 14]
print(A[3])
6
B = A.reshape(3,4)
print(B)
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
print(B[2])
[11 12 13 14]
print(B[0][2])
5
print(B[0,2])
5
# list切片操作
print(B[1,1:3]) # [8 9] 1:3表示1-2不包含3
[8 9]
for row in B:
    print(row)
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
# 如果要打印列,则进行转置即可
for column in B.T:
    print(column)
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]
# 多维转一维
A = np.arange(3,15).reshape((3,4))
# print(A)
print(A.flatten())
# flat是一个迭代器,本身是一个object属性
[ 3  4  5  6  7  8  9 10 11 12 13 14]
for item in A.flat:
    print(item)
3
4
5
6
7
8
9
10
11
12
13
14

これをまとめて、次のスライス値メソッドを見てみましょう (対応する色はそれを取り出した結果です)。

ここに画像の説明を挿入します

5.Numpy配列のマージ

5.1 配列の結合

import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B)))
# vertical stack 上下合并,对括号的两个整体操作。
[[1 1 1]
 [2 2 2]]
C = np.vstack((A,B))
print(C)
[[1 1 1]
 [2 2 2]]
print(A.shape,B.shape,C.shape)# 从shape中看出A,B均为拥有3项的数组(数列)
(3,) (3,) (2, 3)
# horizontal stack左右合并
D = np.hstack((A,B))
print(D)
[1 1 1 2 2 2]
print(A.shape,B.shape,D.shape)
# (3,) (3,) (6,)
# 对于A,B这种,为数组或数列,无法进行转置,需要借助其他函数进行转置
(3,) (3,) (6,)

5.2 配列を行列に転置する

print(A[np.newaxis,:]) # [1 1 1]变为[[1 1 1]]
[[1 1 1]]
print(A[np.newaxis,:].shape) # (3,)变为(1, 3)
(1, 3)
print(A[:,np.newaxis])
[[1]
 [1]
 [1]]

5.3 複数の行列の結合

# concatenate的第一个例子
print("------------")
print(A[:,np.newaxis].shape) # (3,1)
------------
(3, 1)
A = A[:,np.newaxis] # 数组转为矩阵
B = B[:,np.newaxis] # 数组转为矩阵
print(A)
[[1]
 [1]
 [1]]
print(B)
[[2]
 [2]
 [2]]
# axis=0纵向合并
C = np.concatenate((A,B,B,A),axis=0)
print(C)
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]
# axis=1横向合并
C = np.concatenate((A,B),axis=1)
print(C)
[[1 2]
 [1 2]
 [1 2]]

5.4 マージ例 2

# concatenate的第二个例子
print("-------------")
a = np.arange(8).reshape(2,4)
b = np.arange(8).reshape(2,4)
print(a)
print(b)
print("-------------")
-------------
[[0 1 2 3]
 [4 5 6 7]]
[[0 1 2 3]
 [4 5 6 7]]
-------------
# axis=0多个矩阵纵向合并
c = np.concatenate((a,b),axis=0)
print(c)
[[0 1 2 3]
 [4 5 6 7]
 [0 1 2 3]
 [4 5 6 7]]
# axis=1多个矩阵横向合并
c = np.concatenate((a,b),axis=1)
print(c)
[[0 1 2 3 0 1 2 3]
 [4 5 6 7 4 5 6 7]]

6.Numpy array分割

6.1 3 行 4 列の行列を作成する

import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

6.2 等分割

# 等量分割
# 纵向分割同横向合并的axis
print(np.split(A, 2, axis=1))
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
# 横向分割同纵向合并的axis
print(np.split(A,3,axis=0))
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

6.3 不等分割

print(np.array_split(A,3,axis=1))
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

6.4 他のセグメンテーション方法

# 横向分割
print(np.vsplit(A,3)) # 等价于print(np.split(A,3,axis=0))
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
# 纵向分割
print(np.hsplit(A,2)) # 等价于print(np.split(A,2,axis=1))
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]

7.Numpy コピーと =

7.1 =割り当て方法は結合型になります

import numpy as np
# `=`赋值方式会带有关联性
a = np.arange(4)
print(a) # [0 1 2 3]
[0 1 2 3]
b = a
c = a
d = b
a[0] = 11
print(a) # [11  1  2  3]
[11  1  2  3]
print(b) # [11  1  2  3]
[11  1  2  3]
print(c) # [11  1  2  3]
[11  1  2  3]
print(d) # [11  1  2  3]
[11  1  2  3]
print(b is a) # True
True
print(c is a) # True
True
print(d is a) # True
True
d[1:3] = [22,33]
print(a) # [11 22 33  3]
[11 22 33  3]
print(b) # [11 22 33  3]
[11 22 33  3]
print(c) # [11 22 33  3]
[11 22 33  3]

7.2 copy() 代入メソッドには関連性がない

a = np.arange(4)
print(a) # [0 1 2 3]
[0 1 2 3]
b =a.copy() # deep copy
print(b) # [0 1 2 3]
[0 1 2 3]
a[3] = 44
print(a) # [ 0  1  2 44]
print(b) # [0 1 2 3]

# 此时a与b已经没有关联
[ 0  1  2 44]
[0 1 2 3]

8.ブロードキャストの仕組み

numpy 配列間の基本的な操作は 1 対 1 です。つまりa.shape==b.shape、2 つが異なる場合、次の例のようにブロードキャスト メカニズムが自動的にトリガーされます。

from numpy import array
a = array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = array([0,1,2])
print(a+b)
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

なぜこんなことになっているのでしょうか?

a.shape==b.shapeここでは、タイルを使用して上記の操作をシミュレートし、状況に戻ります。

# 对[0,1,2]行重复3次,列重复1次
b = np.tile([0,1,2],(4,1))
print(a+b)
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

この際、写真をあげましょう

ここに画像の説明を挿入します

次の図も見ることができます。
ここに画像の説明を挿入します

どんな状況でも大丈夫ですか?

もちろんそうではありません。trailing dimensions compatibleブロードキャストは配列が 2 つある場合にのみトリガーされ、そうでない場合はエラーが報告されますValueError: frames are not aligned exception

上の式は、テールの寸法に互換性がなければならないことを意味します。

9. よく使う機能

9.1 np.bincount()

x = np.array([1, 2, 3, 3, 0, 1, 4])
np.bincount(x)
array([1, 2, 1, 2, 1], dtype=int64)

インデックスの出現数をカウントします。インデックス 0 は 1 回、1 は 2 回、2 は 1 回、3 は 2 回、4 は 1 回出現します。

したがって、bincount によって計算されるインデックスの出現数は次のようになります。

上記はどうやって得たのですか?

ビンカウントの計算では、ビンの数は「 の数字は何を表しますか?」の最大数より 1 つ多くなります。これは、インデックス値が x に出現する回数を表します。

上記の x を例として、重みパラメータを設定すると、結果はどうなるでしょうか?

これは次のことを前提としています。

w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])

では、この w 重みを設定した結果はどうなるでしょうか?

np.bincount(x,weights=w)
array([ 0.1, -0.6,  0.5,  1.3,  1. ])

どのように計算されますか?

まず x と w を抽出します。

x ---> [1, 2, 3, 3, 0, 1, 4]

w ---> [0.3,0.5,0.7,0.6,0.1,-0.9,1]
インデックス 0 は x のインデックス = 4 に表示され、その後、w のインデックス = 4 の位置にアクセスするだけです (w[4]=0.1)。

インデックス 1 は、 x の Index=0 および Index=5 の位置に表示されます。次に、 wのindex=0および の位置にアクセスしindex=5、その 2 つを加算して計算します。w[0]+w[5]=-0.6
残りは、上記の方法に従って行うことができます。

bincount のもう 1 つのパラメータは minlength ですが、このパラメータは単純で、与えられたビンの数が実際に x から取得されるビンの数よりも多い場合、後でアクセスされないものは 0 に設定されることがわかります。

または、上記の x を例として取り上げます。

ここでは、minlength=7 パラメータを直接設定して出力します。

np.bincount(x,weights=w,minlength=7)
array([ 0.1, -0.6,  0.5,  1.3,  1. ,  0. ,  0. ])

上記と比べると、0が2つ増えていますが、どうしてこの2つが増えるのでしょうか?

上でわかったように、ビンの数は 5 で、インデックスは 0 ~ 4 です。次に、minlength が 7、つまり全長が 7 の場合、インデックスは 0 ~ 6 になります。余分なビットがある場合は、ビットを 0 で埋めてください。

9.2 np.argmax()

関数のプロトタイプは次のとおりですnumpy.argmax(a, axis=None, out=None)

この関数は、軸に沿った最大値のインデックスを返します。

x = [[1,3,3],
     [7,5,2]]
print(np.argmax(x))
3

この例では、7 が最大であり、インデックス位置は 3 であることがわかります (このインデックスは昇順です)。

軸属性

axis=0 は列ごとの操作、つまり現在の列を比較して最大値のインデックスを見つけることを意味します。

x = [[1,3,3],
     [7,5,2]]
print(np.argmax(x,axis=0))
[1 1 0]

axis=1 は行ごとの操作、つまり現在の行を比較して最大値のインデックスを見つけることを意味します。

x = [[1,3,3],
     [7,5,2]]
print(np.argmax(x,axis=0))
[1 1 0]

最大の繰り返し要素が見つかったらどうなるでしょうか?

最初の最大値インデックスを返すだけです。

例えば:

x = np.array([1, 3, 2, 3, 0, 1, 0])
print(x.argmax())
1

9.3 上記の合併例

ここでは、たとえば次のように上記 2 つの関数を組み合わせます。

x = np.array([1, 2, 3, 3, 0, 1, 4])
print(np.argmax(np.bincount(x)))
1

最終結果は 1 ですが、なぜですか?

まず、np.bincount(x)取得される結果は次のとおりです。[1 2 1 2 1]次に、最後に見つかった繰り返し最大値項目に基づいて、最初の最大値のインデックスを返すことができます。2 のインデックスは 1 なので、1 が返されます。

9.4 精度を求める

np.around([-0.6,1.2798,2.357,9.67,13], decimals=0)#取指定位置的精度
array([-1.,  1.,  2., 10., 13.])

負の数は、より大きな絶対値を取るために繰り上げられることがわかりましたか?

np.around([1.2798,2.357,9.67,13], decimals=1)
array([ 1.3,  2.4,  9.7, 13. ])
np.around([1.2798,2.357,9.67,13], decimals=2)
array([ 1.28,  2.36,  9.67, 13.  ])

上記からもわかるように、小数とは有効な数字を保持する桁数を指定することを意味し、5を超える場合は桁上げされます(このときは5も含みます)!

しかし、このパラメータが負の数値に設定されている場合、それは何を意味するのでしょうか?

np.around([1,2,5,6,56], decimals=-1)
array([ 0,  0,  0, 10, 60])

5を超えると(5は含まず)運ばれることがわかりましたか!-1 は 1 桁のみを四捨五入できることを意味するため、-2 に変更すると 2 桁を見る必要があります。

np.around([1,2,5,50,56,190], decimals=-2)
array([  0,   0,   0,   0, 100, 200])

わかりましたか? 2 桁を見なければなりません。50 を超える場合は四捨五入されます。190 であれば次の 2 桁を見ます。下 2 桁が 90 または 50 を超える場合は、四捨五入されます。四捨五入して200です!

指定された軸に沿った N 次元に沿った離散的な差分を計算します

x = np.arange(1 , 16).reshape((3 , 5))
print(x)
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]
np.diff(x,axis=1) #默认axis=1
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
np.diff(x,axis=0) 
array([[5, 5, 5, 5, 5],
       [5, 5, 5, 5, 5]])

丸め

np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])
array([-1., -2., -1., -2.,  0.,  1.,  1.])

負の数値の四捨五入が上記の左側と同じであることがわかりましたか。

上限を取る

np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])
array([ 2.,  2.,  2.,  3.,  2., -0., -0., -0.])

上限を取りましょう!この小数点の最大の整数を見つけるだけです。

探す

np.where を使用して 0 未満の値を 0 で埋めることはできますか? 0 より大きい数値は変更されません。

x = np.array([[1, 0],
       [2, -2],
     [-2, 1]])
print(x)
[[ 1  0]
 [ 2 -2]
 [-2  1]]
np.where(x>0,x,0)
array([[1, 0],
       [2, 0],
       [0, 1]])

記事ごとに 1 つの単語

来て

おすすめ

転載: blog.csdn.net/weixin_47723732/article/details/132882659