8-Python 科學計算_numpy 篇

課程概要:
  1、Python 科學計算介紹
  2、Numpy 之 ndarray 對象
  3、Numpy 之 ufunc 運算
  4、Numpy 之 矩陣運算

1、Python 科學計算介紹

一、什么是科學計算?

是一個與數(shù)學模型構(gòu)建、定量分析以及利用計算機來分析和解決科學問題相關(guān)的研究領(lǐng)域。

二、Python 與科學計算

Python 語法簡單易學
  擁有numpy、scipy、matplotlib等庫
  跨平臺,開源免費

三、Python 中常用的的科學計算庫

numpy
   scipy
   pandas
   matplotlib

四、python(x,y)中包含很多的庫(盡管有很多用不到),還是很好用的


2、numpy 之 ndarray 對象

一、array()

import numpy as np

a =np.array([1,2,3,4])             #       array([1,2,3,4])
b =np.array((1,2,3,4))             #       array([1,2,3,4])
c =np.array([[1,2,3],[2,3,4]])           

c.dtpye                                                   #       dtype(“int64”)

c.shape                                                   #       (2,3)
c =np.array([[1,2,3],[2,3,4]])

c.shape = -1,2                                       

當c.shape 中有一個 -1 值,就會自動補齊。以-1,2中的2為準,表示2列。

n = c.reshape((2,3))                            

n[0][0] = 10                                            

n                                                              

c                                                             

n和c共享一個內(nèi)存,當改變n中的數(shù)組元素的值時,c中也會相應(yīng)地改變。

np.array(1,10,2)            #       array([1,3,5,7,9])

np.logspace(1,10,3)         #       在1到10中生成等比數(shù)列,3代表3個元素
s ="hello"

np.fromstring(s,dtype= np.int8)  #       生成字符串每個元素的ascii值的數(shù)組

#       array([104, 101, 108, 108, 111], dtype=int8), h的ascii值為104
a= np.array([1,2,3])

a[0]                              #       1
a[1:2]                           #       array([2])              
a[1]= 10                                                 

a                                #       array([1,10,3])

二、定義結(jié)構(gòu)體數(shù)組

>>>person = np.dtype({'names':['name','age'],'formats':['S32','i']})                
# ‘S32’—32字節(jié)字符串類型,’i’—int32

>>>person
dtype([('name','S32'), ('age', '<i4')])

>>> a =np.array([('zhang',12)],dtype = person)
>>> a
array([('zhang',12)],dtype=[('name', 'S32'), ('age','<i4')])

>>>a[0]
('zhang', 12)

>>>a[0][0]
'zhang'

>>>a[0][1]
12

>>>a[0]['name']
'zhang'

>>>a[0]['age']
12

3、numpy 之ufunc 運算

>>>
x = np.arange(1,10,1)

>>> x
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> y = np.sin(x)                    #       計算x數(shù)組中每個元素的正弦值
>>> y

下面看看使用標準庫和ufunc庫計算數(shù)據(jù)的使用時間

>>> import numpy as np
>>> from time import time
>>> x = [i*0.001 for i in xrange(10000)]
>>> start = time()
>>> import math
>>> for i,t in enumerate(x):
         x[i] = math.sin(t)

>>> print time() - start
190.217000008
>>> x = [i*0.001 for i in xrange(10000)]
>>> x = np.array(x)
>>> start = time()
>>> np.sin(x,x)

>>> print time() - start

36.5990002155

可見使用numpy庫進行數(shù)據(jù)運算,其效率遠遠大于標準庫

>>>x = np.array([1,2,3])
>>> y = np.array([3,2,4])

>>> x + y                                                 
array([4, 4, 7])

>>> x - y
array([-2,  0, -1])

>>> x * y
array([ 3,  4, 12])

>>> x / y

array([0, 1, 0])

>>> x ** y
array([ 1,  4, 81])

運算均是數(shù)組中同一索引下的元素的運算,如果元素不對應(yīng),則不能進行運算

import numpy as np

def func(x,c,c0,hc):
    x = x - int(x)
    if x >= c: r = 0.0
    elif x < c0: r = x/c0*hc
    else:
        r = ((c-x)/(c-c0))*hc
 
    return r

print func(1,0.6,0.4,1.0)                          #       0.0

print func(0.2,0.6,0.4,1.0)                      #       0.5

print func(0.4,0.6,0.4,1.0)                     #       1.0
x = np.linspace(0,2,100)               #       生成一個0到2的100個元素的列表
y = np.array( [ func(t,0.6,0.4,1.0) for t in x] )

print y
x =np.linspace(0,2,100)
funcs =np.frompyfunc(lambda x:func(x,0.6,0.4,1.0),1,1)       

#兩個1表示一個輸入?yún)?shù),一個為輸出參數(shù),是np.frompyfunc的參數(shù)

y = funcs(x)

print y
def func(c,c0,hc):
    def trifunc(x):
        x = x - int(x)
        if x >= c: r = 0.0
        elif x < c0: r = x/c0*hc
        else:
            r = ((c-x)/(c-c0))*hc
        return r

    return np.frompyfunc(trifunc,1,1)            #       生成的是一個函數(shù)對象

x =np.linspace(0,2,100)
y =func(0.6,0.4,1.0)(x)

print y

# print y.astype(np.float64)        
#  frompyfunc不能保證返回的內(nèi)容數(shù)據(jù)類型一致

4、numpy 之矩陣運算

>>> a =np.arange(12).reshape(2,3,2)

# arange使用和range的使用方法一樣。reshape(2,2,3)轉(zhuǎn)換成2個2行3列的矩陣
>>> b =np.arange(12,24).reshape(2,2,3)

>>> c = np.dot(a,b)                                                         #       將a,b兩個數(shù)組相乘
b =np.arange(12,24).reshape(2,3,2)

>>> c =np.inner(a,b)                                             #       a,b兩個數(shù)組的內(nèi)乘
>>> c =np.outer([1,2,3],[4,5,6])                         #       a,b 兩個數(shù)組的外乘

>>> c
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容