Python基礎 資料科學入門(十)numpy庫

2021-10-19 12:50:40 字數 4971 閱讀 7952

1.1 低效的python for迴圈

例:求100萬個數的倒數

def

compute_reciprocals

(values)

: res =

for value in values:

1/value)

return res

values =

list

(range(1

,10000))

%timeit compute_reciprocals(values)

# %timeit: ipython中統計執行時間的魔術方法(多次執行獲取平均值)

#1.86 ms ± 91.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

import numpy as np

values = np.arange(1,

10000

)%timeit 1

/values

#實現相同計算,時間遠低於for迴圈 28.3 µs ± 165 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

1.2 numpy為什麼如此高效

numpy是由c語言編寫的

編譯型語言vs解釋型語言

c語言執行時,對**進行整體編譯,速度更快

連續單一型別儲存vs分散多變型別儲存

numpy陣列內的資料型別必須是統一的,如全部是浮點型別,而python列表支援任意型別資料的填充

numpy陣列內的資料連續儲存在記憶體中,而python列表的資料分散在記憶體中

這種儲存結構,與一些更加高效的底層處理方式更加契合

多執行緒vs執行緒鎖

python語言執行時有執行緒鎖,無法真正實現多執行緒並行,而c語言可以

1.3 什麼時候用numpy

在資料處理過程中,遇到使用「python for 迴圈」實現一些向量化、矩陣化操作的時候,要優先考慮使用numpy,如:兩個向量的點乘、矩陣乘法等

2.1 從列表開始建立

import numpy as np

x = np.array([1

,2,3

,4,5

])print

(x)print

(type

(x))

print

(type

(x[0])

)print

(x.shape)

'''[1 2 3 4 5]

(5,)

'''

設定陣列的資料型別

x = np.array([1

,2,3

,4,5

], dtype=

"float32"

)print

(x)#[1. 2. 3. 4. 5.]

print

(type

(x[0])

)#

二維陣列

x = np.array([[

1,2,

3],[

4,5,

6],[

7,8,

9]])

print

(x)print

(type

(x))

'''[[1 2 3]

[4 5 6]

[7 8 9]]

'''

2.2 從頭建立陣列

建立長度為5的陣列,值都為0

np.zeros(

5, dtype=

int)

#array([0, 0, 0, 0, 0])

建立乙個2*4的浮點型陣列,值都為1

np.ones((2

,4), dtype=

float

)'''

array([[1., 1., 1., 1.],

[1., 1., 1., 1.]])

'''

建立乙個3*5的陣列,值都為8.8

np.full((3

,5),

8.8)

'''array([[8.8, 8.8, 8.8, 8.8, 8.8],

[8.8, 8.8, 8.8, 8.8, 8.8],

[8.8, 8.8, 8.8, 8.8, 8.8]])

'''

建立乙個3*3的單位矩陣

np.eye(3)

'''array([[1., 0., 0.],

[0., 1., 0.],

[0., 0., 1.]])

'''

建立乙個線性序列陣列,從1開始,到15結束,步長為2

np.arange(1,

15,2)

#array([ 1, 3, 5, 7, 9, 11, 13])

建立乙個4個元素的陣列,這四個數均勻的分配到0-1

np.linspace(0,

1,4)

#array([0. , 0.33333333, 0.66666667, 1. ])

建立乙個10個元素的陣列,形成1-10^9的等比數列

np.logspace(0,

9,5)

#array([1.00000000e+00, 1.77827941e+02, 3.16227766e+04, 5.62341325e+06,1.00000000e+09])

建立乙個3*3的,在0-1之間均勻分布的隨機數構成的陣列

np.random.random((3

,3))

'''array([[0.15953838, 0.30331087, 0.05056098],

[0.70745671, 0.69659685, 0.43136975],

[0.12896815, 0.22934018, 0.86723514]])

'''

建立乙個3*3的,均值為0,標準差為1的隨機數構成的陣列

np.random.normal(0,

1,(3

,3))

'''array([[ 0.49620453, -0.25830437, 0.1877723 ],

[ 1.08625394, -0.38841006, -0.96904936],

[ 0.42627348, -0.72023391, -0.12896755]])

'''

建立乙個3*3的,在[0,10)之間隨機整數構成的陣列

np.random.randint(0,

10,(3

,3))

'''array([[8, 7, 1],

[5, 3, 8],

[4, 7, 5]])

'''

隨機重排列

x = np.array([10

,20,30

,40])

np.random.permutation(x)

#array([20, 40, 30, 10]) 產生新的列表

np.random.shuffle(x)

print

(x)#[30 10 40 20] 修改原列表

隨機取樣

#按指定形狀取樣

x = np.arange(10,

25, dtype =

float

)x #array([10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,23., 24.])

np.random.choice(x, size=(4

,3))

#從x陣列中隨機抽取元素取樣

'''array([[12., 22., 17.],

[21., 16., 15.],

[10., 24., 15.],

[21., 13., 14.]])

'''

#按概率取樣

np.random.choice(x, size=(4

,3), p=x/np.

sum(x)

)'''

array([[18., 12., 17.],

[11., 16., 15.],

[14., 15., 20.],

[24., 19., 19.]])

'''

3.1 陣列的屬性
x = np.random.randint(

10, size=(3

,4))

x'''

array([[4, 0, 4, 8],

[7, 1, 9, 0],

[3, 7, 3, 8]])

'''

陣列的形狀shape

x.shape   #(3, 4)
陣列的維度ndim

x.ndim   #2

y = np.arange(10)

print

(y)#[0 1 2 3 4 5 6 7 8 9]

y.ndim #1

陣列的大小size

x.size  #12
陣列的資料型別dtype

x.dtype  #dtype('int32')
3.2 陣列索引

一維陣列的索引

python資料科學入門與分析

1.print hello capitalize 將第乙個字元轉化為大寫,其他字元轉化為小寫 2.print hello world strip 注意lstrip,rstrip,strip的用法 3.print www.baidu.com split 會用split裡面的分割符進行分割 4print...

Python資料科學numpy的基礎屬性 建立

numpy是乙個底層為ndarray型別的資料科學包,特點是快速的科 算,以陣列形式存在的。通常和pandas matplotlibs合用,含有較多的統計分析函式。a np.array 20,3,24 23,4,2 print 陣列形狀 str a.shape print 陣列的軸數 str a.n...

OpenCV基礎入門(十)

第十節 形態學操作 二 開操作 open 先腐蝕後膨脹 可以去掉小的物件,假設物件是前景色,背景是黑色 閉操作 close 先膨脹後腐蝕 bin2 可以填充小的洞 fill hole 假設物件是前景色,背景是黑色 形態學梯度 morphological gradient 膨脹減去腐蝕 又稱為基本梯度...