python科學計算與可視化


一、Numpy 庫

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。

引用:

import numpy as np
import numpy as np
# 創建簡單的列表
a = [1, 2, 3, 4]
# 將列表轉換為數組
b = np.array
(a)

Numpy查看數組屬性:

數組元素個數:

b.size

數組形狀:

b.shape

數組維度:

b.ndim

數組元素類型:

b.dtype

快速創建N維數組的api函數:

(1)創建10行10列的數值為浮點1的矩陣:

array_one = np.ones([10, 10]

(2)創建10行10列的數值為浮點0的矩陣:

array_zero = np.zeros([10, 10])

Numpy創建隨機數組np.random

  • 均勻分布

    • np.random.rand(10, 10)創建指定形狀(示例為10行10列)的數組(范圍在0至1之間)
    • np.random.uniform(0, 100)創建指定范圍內的一個數
    • np.random.randint(0, 100) 創建指定范圍內的一個整數
  • 正態分布

    給定均值/標准差/維度的正態分布np.random.normal(1.75, 0.1, (2, 3)

NumPy 創建數組

ndarray 數組除了可以使用底層 ndarray 構造器來創建外,也可以通過以下幾種方式來創建。

numpy.empty

numpy.empty 方法用來創建一個指定形狀(shape)、數據類型(dtype)且未初始化的數組:

numpy.empty(shape, dtype = float, order = 'C')

參數說明:

參數 描述
shape 數組形狀
dtype 數據類型,可選
order 有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機內存中的存儲元素的順序。

numpy.zeros

創建指定大小的數組,數組元素以 0 來填充:

numpy.zeros(shape, dtype = float, order = 'C')

參數說明:

 

參數 描述
shape 數組形狀
dtype 數據類型,可選
order 'C' 用於 C 的行數組,或者 'F' 用於 FORTRAN 的列數組

numpy.ones

創建指定形狀的數組,數組元素以 1 來填充:

numpy.ones(shape, dtype = None, order = 'C')

NumPy 從已有的數組創建數組

numpy.asarray

numpy.asarray 類似 numpy.array,但 numpy.asarray 只有三個,比 numpy.array 少兩個。

numpy.asarray(a, dtype = None, order = None)

參數說明:

參數 描述
a 任意形式的輸入參數,可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維數組
dtype 數據類型,可選
order 可選,有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機內存中的存儲元素的順序

numpy.frombuffer

numpy.frombuffer 用於實現動態數組。

numpy.frombuffer 接受 buffer 輸入參數,以流的形式讀入轉化成 ndarray 對象。

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注意:buffer 是字符串的時候,Python3 默認 str 是 Unicode 類型,所以要轉成 bytestring 在原 str 前加上 b。

參數說明:參數描述buffer可以是任意對象,會以流的形式讀入。dtype返回數組的數據類型,可選count讀取的數據數量,默認為-1,讀取所有數據。offset讀取的起始位置,默認為0。

numpy.fromiter

numpy.fromiter 方法從可迭代對象中建立 ndarray 對象,返回一維數組。

numpy.fromiter(iterable, dtype, count=-1
   

參數描述iterable可迭代對象dtype返回數組的數據類型count讀取的數據數量,默認為-1,讀取所有數據

二、matplotlib庫
matplotlib是python上的一個2D繪圖庫,它可以在誇平台上邊出很多高質量的圖像。綜旨就是讓簡單的事變得更簡單,讓復雜的事變得可能。我們可以用matplotlib生成 繪圖、直方圖、功率譜、柱狀圖、誤差圖、散點圖等 。
引用:
import matplotlib.pyplot as plt

散點圖

plt.scatter(X, Y, s=75, c=T, alpha=.5)

其中X,Y分別為橫縱坐標;s為點的大小(optional);c為顏色設置(optional);alpha為透明度設置(optional),是一個小於等於1的值

圖片附加信息:

plt.xlim((-1, 1))  #  設置x軸范圍為(-1,1)
plt.ylim((-1, 1))  #  設置y軸范圍為(-1,1)
plt.legend()  # 顯示圖例
plt.show()  #  顯示繪圖

柱狀圖

x = np.arange(10)

y = 2**x + 10

plt.bar(x,y,facecolor='#9999ff',edgecolor='white')#柱顏色,柱邊框顏色

for x,y in zip(x,y):#zip指把x,y結合為一個整體,一次可以讀取一個x和一個y

    plt.text(x,y,'%.2f' % y,ha='center',va='bottom')#指字體在中間和柱最頂的頂部

plt.show()

 

 等高圖:

def f(x,y):

    #用來生成高度

    return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

 

x = np.linspace(-3,3,100)

y = np.linspace(-3,3,100)

 

X,Y = np.meshgrid(x,y)#將x,y指傳入網格中

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)#8指圖中的8+1根線,繪制等溫線,其中cmap指顏色

 

C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)#colors指等高線顏色

plt.clabel(C,inline=True,fontsize=10)#inline=True指字體在等高線中

 

plt.xticks(())

plt.yticks(())

plt.show()

 matplotlib繪制3D圖:

from mpl_toolkits.mplot3d import Axes3D#動態圖所需要的包

fig = plt.figure()

ax = Axes3D(fig)

 

x = np.arange(-4,4,0.25)#0.25指-4至4間隔為0.25

y = np.arange(-4,4,0.25)

X,Y = np.meshgrid(x,y)#x,y放入網格

R = np.sqrt(X**2 + Y**2)

Z = np.sin(R)

 

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))#rstride=1指x方向和y方向的色塊大小

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')#zdir指映射到z方向,-2代表映射到了z=-2

ax.set_zlim(-2,-2)

 

plt.show()

子圖像:

plt.figure()

plt.subplot(2,2,1)#建立一個兩行兩列的畫布,第一個

plt.plot([0,1],[0,1])

plt.subplot(2,2,2)#第二個

plt.plot([0,1],[0,1])

plt.subplot(2,2,3)#第三個

plt.plot([0,1],[0,1])

plt.subplot(2,2,4)#第四個

plt.plot([0,1],[0,1])

plt.show()

動態圖:

 

from matplotlib import animation#動態圖所需要的包

fig,ax = plt.subplots()#子圖像

x = np.arange(0,2*np.pi,0.01)

line, = ax.plot(x,np.sin(x))

 

def animate(i):

    line.set_ydata(np.sin(x+i/10))#用來改變的y對應的值

    return line,

def init():

    line.set_ydata(np.sin(x))#動態圖初始圖像

    return line,

 

ani = animation.FuncAnimation(fig=fig,func=animate,init_func=init,interval=20)#動態作圖的方法,func動態圖函數,init_func初始化函數,interval指圖像改變的時間間隔

plt.show()

三、雷達圖

 python123 的成績雷達圖:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
labels = np.array(['第二周', '第三周', '第四周', '第五周', '第六周'])
nAttr = 5
data = np.array([90, 90, 100, 100, 90]) #數據值
angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(facecolor="white")
plt.subplot(111, polar=True)
plt.plot(angles,data,'bo-',color ='g',linewidth=2)
plt.fill(angles,data,facecolor='g',alpha=0.25)
plt.thetagrids(angles*180/np.pi, labels)
plt.figtext(0.52, 0.95, '廣師小帥強的成績雷達圖', ha='center')
plt.grid(True)
plt.show()

運行程序結果如圖:

 

 四、手繪效果

#e17.1HandDrawPic.py
from PIL import Image
import numpy as np
vec_el = np.pi/2.2 # 光源的俯視角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
depth = 10. # (0-100)
im = Image.open('C:\\Users\\Administrator\\Desktop\\timg.jpg').convert('L')
a = np.asarray(im).astype('float')
grad = np.gradient(a) #取圖像灰度的梯度值
grad_x, grad_y = grad #分別取橫縱圖像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
dx = np.cos(vec_el)*np.cos(vec_az) #光源對x 軸的影響
dy = np.cos(vec_el)*np.sin(vec_az) #光源對y 軸的影響
dz = np.sin(vec_el) #光源對z 軸的影響
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源歸一化
a2 = a2.clip(0,255)
im2 = Image.fromarray(a2.astype('uint8')) #重構圖像
im2.save('fcityHandDraw.jpg')
原圖:

五、數學規律圖

繪制sigmoid函數:

import matplotlib.pyplot as plt

import numpy as np

 

 

def sigmoid(x):

    # 直接返回sigmoid函數

    return 1. / (1. + np.exp(-x))


def plot_sigmoid():

    # param:起點,終點,間距

    x = np.arange(-8, 8, 0.2)

    y = sigmoid(x)

    plt.plot(x, y)

    plt.show()
if __name__ == '__main__':

    plot_sigmoid()

結果如圖:

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM