1. 程式人生 > >numpy學習基礎篇(一)

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

若有錯誤,請指正。