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()
廣播矩陣
暫略。
結構化數組
暫略。