numpy學習基礎篇(一)
安裝好Numpy模組後,開始在jupyter上執行沒有問題,後來我開了一個pycharm,建立numpy.py這個檔案後,執行開始報如下錯誤:AttributeError: module ‘numpy‘ has no attribute ‘array‘ 由於下載的模組名也為numpy.py,因此建立相同檔名的py檔案後,匯入numpy會首先檢索自己建立的py檔案,將自己的py檔案修改名字即可正常使用。
1.numpy建立陣列的四種方法:
import numpy as np a=np.array([1,2,3]) b=np.array((3,6,5,4)) c=np.arange(10) #建立陣列,範圍為0-10的整數 d=np.linspace(0,5*np.pi,11) #建立陣列,在0-5pi等間隔切分,生成陣列長度為11 e=np.linspace(0,99,10) #建立陣列,在0-99內等間隔切分,生成陣列長度為10 result: a=[1 2 3] b=[3 6 5 4] c=[0 1 2 3 4 5 6 7 8 9] d=[ 0. 1.57079633 3.14159265 4.71238898 6.28318531 7.85398163 9.42477796 10.99557429 12.56637061 14.13716694 15.70796327] e=[ 0. 11. 22. 33. 44. 55. 66. 77. 88. 99.]
2.numpy陣列切片的形式:
#定義了一個6*6的矩陣 a1=np.array([[3,6,5,4, 11, 4], [9, 6, 11, 4, 8, 6], [6, 3, 8, 4, 11, 4], [7, 4, 0, 4, 11, 4], [7, 4, 0, 4, 11, 4], [7, 4, 0, 4, 11, 4]]) result: a1[0,1:4] = [6 5 4] a1[1:4,0] = [9 6 7] a1[:,0] = [3 9 6 7 7 7] a1[::2,0] = [3 6 7] a1[:5:,0] = [3 9 6 7 7] a1[:5:2,0] = [3 6 7]
a[row,column] row為行,column為列。‘ x : y : z ’冒號第一個索引x表示從該行或該列的第x+1個元素開始索引,到第y個元素為止。z表示每間隔z個取一個元素。
3.資料屬性
np陣列實際上被定義為ndarray,dtype表示矩陣元素的型別,size表示元素個數,shape表示矩陣的形狀,itemsize表示元素所佔位元組數,ndim表示矩陣維度,nbytes表示,a1共佔了多少位元組。
a1=np.array([[3, 6, 5, 4, 11, 4], [9, 6, 11, 4, 8, 6], [6, 3, 8, 4, 11, 4], [7, 4, 0, 4, 11, 4], [7, 4, 0, 4, 11, 4], [7, 4, 0, 4, 11, 4]]) print("type(a1) : ",type(a1)) print("a1.dtype : ",a1.dtype) print("a1.size : ",a1.size) print("a1.shape : ",a1.shape) print("a1.itemsize: ",a1.itemsize) print("a1.ndim : ",a1.ndim) print("a1.nbytes : ",a1.nbytes) result: type(a1) : <class 'numpy.ndarray'> a1.dtype : int32 a1.size : 36 a1.shape : (6, 6) a1.itemsize: 4 a1.ndim : 2 a1.nbytes : 144
4.基本操作符
a2=np.arange(9)
a2=a2.reshape((3,3))
b2=np.arange(1,19,2) # arrange 從1到19間隔為2個數取數
b2=b2.reshape((3,3))
print("a2 = ",a2)
print("b2 = ",b2)
print("a2+b2 = ",a2+b2)
print("a2-b2 = ",a2-b2)
print("a2*b2 = ",a2*b2)
print("a2/b2 = ",a2/b2)
print("a2**b2 = ",a2**b2)
print("a2.dot(b2) = ",a2.dot(b2))
reshape((3,3))是對陣列中的9個數轉換成3*3的尺寸,注:如果陣列中元素的個數和reshape的數目不匹配,會報錯。
下面的+ - * / ** 是對應元素之間的運算。 a.dot(b) 是a和b之間的點乘,也就是矩陣的乘法運算。
5.特殊運算子
a3=np.arange(10,99,5)
print("a3 = ",a3)
print("a3.sum() = ",a3.sum())
print("a3.min() = ",a3.min())
print("a3.max() = ",a3.max())
print("a3.cumsum() = ",a3.cumsum())
result:
a3 = [10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95]
a3.sum() = 945
a3.min() = 10
a3.max() = 95
a3.cumsum() = [ 10 25 45 70 100 135 175 220 270 325 385 450 520 595 675 760 850 945]
a.arange(x,y,z) :從數字x開始取,每z個數儲存一次,取到y結束
a.sum() 將數字中所有元素求和。
a.min()or a.max() 求陣列中的最大最小值。
a.cumsum():儲存第一個元素,作為新陣列的第一個元素,儲存a的前兩個元素之和作為第二個元素,以此類推,最後一個元素其值等於a.sum()
6.花式索引
a4=np.arange(0,100,10)
indices=[1,5,-1] #定義一個索引陣列,表示索引號
b4=a4[indices]
print("a4 = ",a4)
print("b4 = ",b4)
result:
a4 = [ 0 10 20 30 40 50 60 70 80 90]
b4 = [10 50 90]
直接上程式碼。
7.布林遮蔽
import matplotlib.pyplot as plt
a=np.linspace(0, 2*np.pi, 50) #取值構建a陣列
b=np.sin(a) #將a陣列中的元素取sin(a)
plt.plot(a,b) #將a,b組成一幅圖片
mask= b>=0
plt.plot(a[mask], b[mask], 'bo') #將符合條件的值用藍色的點畫出
mask=(b>=0)&(a<=np.pi/2)
plt.plot(a[mask], b[mask], 'go') #將符合條件的值用綠色的點畫出
plt.show() #展示圖片
8.預設索引
#一種簡單的預設索引
a=np.arange(0,100,10)
b=a[:5]
c=a[a>50]
print(b)
print(c)
result:
[ 0 10 20 30 40]
[60 70 80 90]
9.where函式
a5=np.arange(0,100,10)
b5=np.where(a5<50)
c5=np.where(a5>=50)[0]
print(b5)
print(c5)
result:
(array([0, 1, 2, 3, 4], dtype=int64),)
[5 6 7 8 9]
where()返回一個使條件為真的陣列的索引。
10.broadcasting(廣播)
broadcasting是一種強大的機制,它允許python陣列中兩個不同size的矩陣或陣列進行算術運算。通常是一個小陣列和一個大陣列,我們需要多次使用小陣列來對大陣列進行操作。
x=np.array([[1,2,3],[4,5,6],[7,8,9]])
v=np.array([1,0,1])
y=x+v
print(y)
v=np.array([1,2,3])
w=np.array([4,5])
print(np.reshape(v,(3,1))*w) #將v轉為3*1的陣列,然後與w相乘。
v=np.reshape(v,(3,1))
w=np.reshape(w,(1,2))
print(v.dot(w))
#其輸出結果相等。
x是一個3*3的陣列,v是1*3的陣列,現在我們直接用x+v表示對x的每一行都加上v陣列。代替了把三個v陣列疊起來然後附加到x上。大大提高運算速度。
本文參考了numpy中文學習文件:https://www.numpy.org.cn/article/basics/an_introduction_to_scientific_python_numpy.html
若有錯誤,請指正。