學習碎碎念:因爲numpy是pandas的基礎,所以學習了這一部分的基礎知識,但是因爲jupyter實在是太好用了,所以就很不想整理這一部分學習的筆記。最近學習狀態不是很好,因爲懶惰和懶散,自己每天學習時長太短了~加油啊!好好學趕緊找工作搬磚!
numpy的學習主要是看視頻資料+numpy官網tutorial+微信文章。
官網tutorial:https://numpy.org/devdocs/user/quickstart.html
在學習過程中發現微信公衆號的排版往往比博客上更舒服和可讀,看一些總結性文章來掌握框架,再從網絡上搜索一些細節的博客可能更適合學習這種有點瑣碎的知識架構。
生成數組
impot numpy as np 導入numpy庫,併爲了簡寫命名爲np
Numpy數組類array class叫做ndarray,與列表相比ndarray各元素並沒有被逗號隔開
np.array
np.array(object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0)
- object
np.array([list]),對於含有str類型的數組,int也會變成str
多維數組用[]來劃分每一個維數 如ar2=np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])就是生成一個二維數組 - dtype
可用於指定生成元素的數組類型,一般默認float 64 - ndmin
生成數組應具有的最小維數(軸數),當實際維數未達到ndmin時,強制轉化爲ndmin(直接加[]來增加維數)
np.random隨機數和np.arange生成器見後面。
import numpy as np
l=[1,2,3,4,5,6]#列表
print('list: ',l,type(l))#list有逗號
ar=np.array([1,2,3,4,5,6])#數組
print('np: ',ar,type(ar))#數組沒有逗號
print(np.array(range(10)))
print(np.arange(10))#生成器
print(np.array([1,2,3,4,5]))#list
print(np.array([[1,2,3,4],[1,2,3,4]]))
print(np.array([[1,2,3],['a','b','c']]))#對含有str類型的數組,int也會變成str
print(np.array([[1],[1,2,3]]))#變成兩個list
print(np.random.rand(10))
print(np.random.rand(10).reshape(2,5))#利用reshape可以改變數組形狀
'''
list: [1, 2, 3, 4, 5, 6] <class 'list'>
np: [1 2 3 4 5 6] <class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
[[1 2 3 4]
[1 2 3 4]]
[['1' '2' '3']
['a' 'b' 'c']]
[list([1]) list([1, 2, 3])]
[0.50904836 0.49565435 0.91427059 0.55389469 0.63312383 0.61583569
0.50579488 0.93944113 0.50271946 0.22356069]
[[0.43748497 0.87667731 0.30465276 0.22989857 0.97472987]
[0.63661429 0.04521706 0.31698298 0.89053813 0.26404541]]
'''
np.arange
類似range用法來創建數組
print(np.arange(10))#0-(n-1)的整數
print(np.arange(0,10,2))#以2爲間隔
print(np.arange(10,0,-1))#以負數爲間隔
print(np.arange(5,10))#改變起始點位置
print(np.arange(5.0))#生成浮點數
'''
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]
[10 9 8 7 6 5 4 3 2 1]
[5 6 7 8 9]
[0. 1. 2. 3. 4.]
'''
np.linspace
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
彌補arange在創建浮點數時不能精確判斷需要創建的數組元素數,linspace可以在指定區間內,按指定樣本數返回均勻間隔樣本。
start:起始值,stop:結束值,num:生成樣本數,默認爲50
endpoint:如果爲真,則stop是最後一個樣本,默認值爲True,False則不包括stop樣本
retstep:如果爲真,retstep返回tuple,包括array樣本和步長step的tuple,
np.linspace
print(np.linspace(1,10,num=10))
print(np.linspace(1,10,num=5))
print(np.linspace(1,10,num=10,endpoint=True))#m默認Ture包含最後一個值
print(np.linspace(1,10,num=10,endpoint=False))#mFalse不包含最後一個值
print(np.linspace(1,10,num=10,retstep=True))#retstep返回tuple,包括array和步長
'''
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[ 1. 3.25 5.5 7.75 10. ]
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[1. 1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1]
(array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
'''
zeros ones eye
zeros全0,ones全1,zeros和ones的用法完全相同,
zeros多維需要加在()內,如np.zeros((3,4))
可以dtype指定類型,默認float64
可以reshape更改尺寸
np.zeros_like(ndarray)生成與ndarray形狀、元素類型都相同的全零數組
eye生成對角線爲1其餘位置全0的正方形矩陣
當eye行列不同時,返回較小數字對應的eye矩陣
print(np.zeros(3))
print(np.zeros((3,4)))#多維要加在括號內,zeros(2,3)是錯的
print(np.zeros(12).reshape(3,4))#多維也可以用reshape
print(np.zeros((3,4),dtype=np.int))#默認浮點型,zeros內的dtype可以改爲int
arr=np.array([[1,2,3,4,5],[1,2,3,4,5]])
print(arr)
#返回具有與給定數組相同的形狀和類型的零數組,元素float或int與arr相同
print(np.zeros_like(arr))
'''
[0. 0. 0.]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[1 2 3 4 5]
[1 2 3 4 5]]
[[0 0 0 0 0]
[0 0 0 0 0]]
'''
#ones ones_like完全同上
print(np.ones(3))
print(np.ones((3,4)))#多維要加在括號內,zeros(2,3)是錯的
print(np.ones(12).reshape(3,4))#多維也可以用reshape
print(np.ones((3,4),dtype=np.int))#默認浮點型,zeros內的dtype可以改爲int
arr=np.array([[1,2,3,4,5],[1,2,3,4,5]])
print(arr)
print(np.ones_like(arr))#生成同維的全1矩陣,元素float或int與arr相同
# eye
print(np.eye(5))
print(np.eye(5,4))#行列不同則返回較小數字的矩陣
重要屬性:
- ndarray.ndim
可以理解爲軸線或者維數(rank秩),一維數組用一個軸就可以索引所有元素,二維數組可以看作兩個一維數組,第一個一維數組中每個元素都是一個一維數組,因此二維數組有兩個軸。 - ndarray.shape
每個維度裏數組的大小 - ndarray.size
數組中所有元素的總數,相當於shape所有元素的乘積 - ndarray.dtype
數組中元素的類型,type也可以用於ndarray,numpy有自己的類型如numpy.int 16, numpy.int32 前者表示int還是float,後者表示字節數。
import numpy as np
l=[1,2,3,4,5,6]#列表
print('list: ',l,type(l))#list有逗號
ar=np.array([1,2,3,4,5,6])#數組
ar#交互輸出有數組前有array
print('np: ',ar,type(ar))#數組沒有逗號
ar2=np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])#二維數組,[]框起來的兩個一位數組
print('np: ',ar2,type(ar2))#數組沒有逗號
print(ar.ndim)#數組維度的個數,rank秩
print(ar2.ndim)
print(ar.shape)#數組維數,(n,m)數組n行m列
print(ar2.shape)
print(ar.size)#數組元素個數
print(ar2.size)
print(ar.dtype)#數組元素中數值類型
print(ar.itemsize)#數組元素字節大小
'''
list: [1, 2, 3, 4, 5, 6] <class 'list'>
np: [1 2 3 4 5 6] <class 'numpy.ndarray'>
np: [[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]] <class 'numpy.ndarray'>
1
2
(6,)
(2, 6)
6
12
int32
4
'''
數組形狀
需要注意ndarry.T 轉置,ndarray.reshape()數組相同更改尺寸,ndarray.resize()都是生成新的數組開闢新的內存區域,而非直接更改原有數組,而ndarray.shape是更改原有數組。
ar1=np.arange(9)
ar2=np.zeros((2,5),dtype=np.int)
print(ar1)
print(ar2)
print('\n-------')
#T 轉置 一位數組轉置結果不變
print(ar1.T)
print(ar2.T)
print('\n-------')
#reshape只能變成元素數相同的不同尺寸矩陣
print(ar1.reshape(3,3))#已有數組改變形狀
print(np.arange(8).reshape(2,4))#生成數組同時改變形狀
print(np.reshape(np.arange(8),(2,4)))
print('\n-------')
#resize 在元素不夠時會進行排序來生成新矩陣
print(np.resize(ar1,(3,3)))
print(np.resize(ar1,(3,4)))
#shape也可以用來修改數組
ar=np.arange(30)
ar.shape=2,-1,3#-1表示按照其他維數確定該項
print(ar.shape)
print(ar)
ar.shape=-1,5,6
print(ar.shape)
print(ar)
'''
[0 1 2 3 4 5 6 7 8]
[[0 0 0 0 0]
[0 0 0 0 0]]
-------
[0 1 2 3 4 5 6 7 8]
[[0 0]
[0 0]
[0 0]
[0 0]
[0 0]]
-------
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 1 2 3]
[4 5 6 7]]
[[0 1 2 3]
[4 5 6 7]]
-------
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 1 2 3]
[4 5 6 7]
[8 0 1 2]]
(2, 5, 3)
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
[[15 16 17]
[18 19 20]
[21 22 23]
[24 25 26]
[27 28 29]]]
(1, 5, 6)
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]]]
'''
數組複製copy
# 數組的複製
ar1 = np.arange(10)
ar2 = ar1
print(ar2 is ar1)
ar1[2] = 9
print(ar1,ar2)
# ar1和ar2指向同一個值,所以ar1改變,ar2一起改變
ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
# copy方法生成新數組及其數據的完整拷貝
#copy方法常與切片一起使用,刪除原數組後新數組仍被保留
ar4=ar1[:5].copy()
del ar1
print(ar4)
'''
True
[0 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
False
[9 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
[9 1 9 3 4]
'''
數據類型轉換 ndarray.astype
ar1=np.arange(3,dtype=float)
ar2=ar1.astype(np.int32)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
'''
[0. 1. 2.] float64
[0 1 2] int32
'''