Numpy 库的学习

Numpy

创建数组时可能会用到的函数

1.array——自定义数组

2.arange——在区间内产生固定步长的一维数组

3.linspace——在区间内产生固定数目的一维数组

4.zeros——产生元素全为 0的数组

5.ones——产生元素全为 1的数组

6.diag——由一维向量产生一个对角矩阵

7.random——产生随机数组

8.reshape——数组维数转换

数组创建

np.array()

c = np.array([[1, 2, 3], [4, 5, 6]])
print(c)
####################
[[1 2 3]
 [4 5 6]]

np.array()

d = np.array(((1, 2, 3), (4, 5, 6)))
print(d)
##################
[[1 2 3]
 [4 5 6]]

np.zeros() 生成 value 為 0 的數組

e = np.zeros((3, 3))

print(e)
##############
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

np.ones() 生成 value 為1的數組

f = np.ones((3, 3))
print(f)
################
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

np.arange()要和 reshape() 配合使用

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

linspace(x, y, z) 將 x 和 y 間隔分爲 z 份,存儲在 1 維數組中,然後用 reshape() 生成二維數組(注意保持前後的數組個數一致)

h = np.linspace(0, 20, 10).reshape(2, 5)
print(h)
-------------------
[[ 0.          2.22222222  4.44444444  6.66666667  8.88888889]
 [11.11111111 13.33333333 15.55555556 17.77777778 20.        ]]

np.diag() 生成對角矩陣,其中屬性是對角的元素

j = np.diag((1, 1, 1))
print(j)
---------------------
[[1 0 0]
 [0 1 0]
 [0 0 1]]

np.random.randn(x, y) 生成 x 行 y 列的數組。

x8 = np.random.randn(3, 4)
print(x8)
------------------------
[[-0.30812235  0.37908646  0.95968283  0.44839058]
 [-1.07795579 -1.22388475  0.03190148 -0.95003816]
 [ 0.10297122  0.31125366 -0.25820269  0.44116239]]

數組運算

元素操作

對每個元素進行操作(如加法),這種方法對減法、乘法等也同樣生效。(就只對加法進行演示了哦(●’◡’●)

a = np.arange(5)
print(a)
a = a + 3
print(a)
------------------------
[0 1 2 3 4]
[3 4 5 6 7]

減法

b = np.arange(5)
print(b)
b = b - 3
print(b)
-------------------------
[0 1 2 3 4]
[-3 -2 -1  0  1]

乘法

e = np.arange(5)
e = e * 3
print(e)
------------------------
[ 0  3  6  9 12]

數組閒

c = np.arange(5)
d = np.arange(5, 10)
print(c + d)
--------------------------
[ 5  7  9 11 13]

矩陣乘

所謂矩陣乘,則是在綫性代數裏面所學的啦~ np.dot(A, B),注意,這裏的A B 也有前後順序的

a = np.arange(1, 5, 1).reshape(2, 2)
b = np.arange(5, 9, 1).reshape(2, 2)
print(a)
print(b)
print(np.dot(a, b))
---------------------------
[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
[[19 22]
 [43 50]]

自加自減

和 python 一樣,雖然不支持 ++ –,但可以使用 += -=(元素操作)

a = np.arange(0, 5, 1)
print(a)
a += 3
print(a)
-------------------------
[0 1 2 3 4]
[3 4 5 6 7]

通用函數

np.sqrt() 求每個元素的平方根

a = np.arange(1, 5, 1)

print(np.sqrt(a))
---------------------
[1.         1.41421356 1.73205081 2.        ]

np.log() 求每個元素的對數

a = np.arange(1, 5, 1)
print(np.log(a))
-----------------------
[0.         0.69314718 1.09861229 1.38629436]

np.sin() 求每個元素的正弦值

a = np.arange(1, 5, 1)
print(np.sin(a))
-----------------------
[ 0.84147098  0.90929743  0.14112001 -0.7568025 ]

array.sum() 求可迭代序列的和

a = np.arange(1, 5, 1)
print(sum(a))
---------------------
10

array.min() 求可迭代序列中的最小值

a = np.arange(1, 5, 1)
print(min(a))
--------------------------
1

array.max() 求可迭代序列中的最大值

a = np.arange(1, 5, 1)
print(max(a))
-----------------------------
4

索引、切片操作

索引與切片(一維)

a = np.arange(10, 16, 1)
print(a)
print(a[1])
print(a[[1, 2, 3]])
print(a[1: 4])
---------------------
[10 11 12 13 14 15]
11
[11 12 13]
[11 12 13]

索引與切片(二維)

b = np.arange(10, 19, 1).reshape(3, 3)
print(b)
print(b[:,:])
print(b[0,:])
print(b[:,0])
print(b[0:2, 0: 2])
-----------------------
[[10 11 12]
 [13 14 15]
 [16 17 18]]
 
[[10 11 12]
 [13 14 15]
 [16 17 18]]
 
[10 11 12]
[10 13 16]

[[10 11]
 [13 14]]

在二維的操作中,可能會出現許多迷惑的操作(不是),但其實理解了之後,也不是那麽困難了。

首先在二位數組 A[ ,]中的逗號是用來分割前後,其中前是代表對行的操作,后是代表對列的操作。若其中的一側只寫出 : ,則是代表 0:len - 1, 1 的縮寫,表示取出其中所有的列(或所有的行)。若其中的一側只寫出0, 則表示取出行(或列)的第一個元素(則第一行或第一列)。同理,寫出1,2 等則表示取出第二行(列)或第三行(列)。

數組的迭代

一維數組的迭代


a = np.arange(0, 5, 1)
print(a)
for item in a:
    print(item)
---------------------
[0 1 2 3 4]
0
1
2
3
4

二維數組的迭代

b = np.arange(0, 12, 1).reshape(3, 4)
print(b)
for row in b:
    print(row)
-------------------------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
 
[0 1 2 3]
[4 5 6 7]
[ 8  9 10 11]

數組切分

np.hsplit() 在豎直方向上對數組進行切分,A:數組,2:切分份數

A = np.arange(16).reshape(4, 4)

[B, C] =np.hsplit(A, 2)
print(B)
print()
print(C)
--------------------------------------
[[ 0  1]
 [ 4  5]
 [ 8  9]
 [12 13]]

[[ 2  3]
 [ 6  7]
 [10 11]
 [14 15]]

np.vsplit() 在水平方向上對數組進行切分,A: 數組,2:切分份數

A = np.arange(16).reshape(4, 4)
[D, E] = np.vsplit(A, 2)
print(D)
print()
print(E)
---------------------------------------
[[0 1 2 3]
 [4 5 6 7]]

[[ 8  9 10 11]
 [12 13 14 15]]

那麽,既然有 vsplit() 和 hsplit() ,那麽肯定就會有 split()啦(不是

split()函數可以用於將數組分爲幾個不對稱的部分。

split(arr, sections, axis = 0),其中,arr指的是你要劃分的數組,sections可傳遞數組,也可以傳遞整數。黨 sections 為整數時,將數組按照軸指定的方向(axis)進行等量的劃分。若sections 為數組,如[1:3], 則按軸的方向劃分爲:[0:1],[1:3],[3:]

A = np.arange(16).reshape(4, 4)
[A1, A2, A3] = np.split(A, [1, 3], axis = 1)
print(A1)
print()
print(A2)
print()
print(A3)
------------------------------------------
[[ 0]
 [ 4]
 [ 8]
 [12]]

[[ 1  2]
 [ 5  6]
 [ 9 10]
 [13 14]]

[[ 3]
 [ 7]
 [11]
 [15]]

数字的排列

x2 = np.random.permutation(5)
print(x2)
------------------
[4 2 0 1 3]

單位矩陣的生成

x3 = np.eye(5)
print(x3)
------------------
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
x4 = np.ones(5)
x5 = np.diag(x4)
print(x5)
print(np.shape(x5))
print(np.size(x5, axis=0))
-----------------------
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
(5, 5)
5

布爾數組

在對數組使用條件運算符后,可以得到一個由布爾值組成的數組。

A = np.random.random((4, 4))
print(A)

print(A > 0.5)
-------------------------------------
[[0.50962487 0.75864429 0.25213214 0.92076804]
 [0.39439605 0.4121026  0.58767064 0.16248415]
 [0.86350193 0.38381952 0.04503625 0.62540455]
 [0.13265593 0.1392252  0.9332574  0.48014028]]
 
 [[ True  True False  True]
 [False False  True False]
 [ True False False  True]
 [False False  True False]]

數組形狀變換

Array.reshape(x, y) 將 Array 數組變化為一個 x 乘 y 的矩陣(需保持前後元素個數一致哦)

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

Array.ravel() 將數組返回為原始數組的形狀

A = np.arange(0, 12, 1)
#print(A)
B = A.reshape(3, 4)

print(B)
B = B.ravel()
print(B)
----------------------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[ 0  1  2  3  4  5  6  7  8  9 10 11]

Array.shape = () 直接通過屬性來修改數組的長和寬(記得保持數組個數的一致哦)

C = np.arange(0, 12, 1).reshape(3, 4)
print(C)
C.shape = (2, 6)
print(C)
------------------------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]

Array.transpose() 求一個矩陣的轉置矩陣(很重要哦

D = np.arange(0, 12, 1).reshape(3, 4)
print(D)
D = D.transpose()
print(D)
--------------------------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

三維矩陣

x5 = np.linspace(0, 10, 24)
x6 = np.reshape(x5,(3, 2, 4))
print(x6)
-------------------------------------
[[[ 0.          0.43478261  0.86956522  1.30434783]
  [ 1.73913043  2.17391304  2.60869565  3.04347826]]

 [[ 3.47826087  3.91304348  4.34782609  4.7826087 ]
  [ 5.2173913   5.65217391  6.08695652  6.52173913]]

 [[ 6.95652174  7.39130435  7.82608696  8.26086957]
  [ 8.69565217  9.13043478  9.56521739 10.        ]]]

矩陣的求逆

計算逆矩陣可以通過 numpy.linalg.inv() 來計算,然而當矩陣不可逆時無法通過此方法進行計算;此時需要使用 np.linalg.pinv() 來計算廣義逆矩陣。

A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.linalg.pinv(A))
-------------------------------
[[-6.38888889e-01 -1.66666667e-01  3.05555556e-01]
 [-5.55555556e-02  1.30136518e-16  5.55555556e-02]
 [ 5.27777778e-01  1.66666667e-01 -1.94444444e-01]]

數組的連接

​ vstack()


廣播矩陣

暫略。

結構化數組

暫略。