作者介紹:Python領域優質創作者、華為雲享專家、阿裡雲專家博主、2021年CSDN博客新星Top6
- 本文已收錄於Python全棧系列專欄:《100天精通Python從入門到就業》
- 此專欄文章是專門針對Python零基礎小白所准備的一套完整教學,從0到100的不斷進階深入的學習,各知識點環環相扣
- 訂閱專欄後續可以閱讀Python從入門到就業100篇文章;還可私聊進兩百人Python全棧交流群(手把手教學,問題解答);進群可領取80GPython全棧教程視頻 + 300本計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
- 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!
NumPy 是 Python 語言的一個第三方庫,其支持大量高維度數組與矩陣運算。此外,NumPy 也針對數組運算提供大量的數學函數。機器學習涉及到大量對數組的變換和運算,NumPy 就成了必不可少的工具之一。
作用:NumPy是一個運行速度非常快的數學庫,主要用於數組計算
包含:
一個強大的N維數組對象ndarray
廣播功能函數
線性代數、傅裡葉變換、隨機數生成等功能
優勢:
NumPy定義了一個n維數組對象,簡稱ndarray對象,它是一個一系列相同類型元素組成的數組集合。數組中的每個元素都占有大小相同的內存塊
ndarray對象采用了數組的索引機制,將數組中的每個元素映射到內存塊上,並且按照一定的布局對內存塊進行排列(行或列)。
1. window電腦點擊win鍵+ R
,輸入:cmd
2. 安裝numpy
,輸入對應的pip命令:pip install numpy
,我已經安裝過了出現版本就安裝成功了
3. 導包
import numpy as np
numpy支持的數據類型比Python內置的類型要多很多,基本上可以和C語言的數據類型對應上,其中部分類型對應為Python內置的類型
numpy的數值類型實際上是dtype對象的實例,並對應唯一-的字符, 包括np.bool_ ,np.int32,np.float32, 等等
數據類型對象是用來描述與數組對應的內存區域如何使用,這依賴如下幾個方面:
創建數據類型對象語法:numpy.dtype(object, align, copy)
參數說明:
基本使用:
>>> import numpy as np
>>> dt = np.dtype(np.int32)
>>> print(dt)
int32
>>> print(type(dt))
<class 'numpy.dtype[int32]'>
# 數據類型縮寫
>>> dt1 = np.dtype('i1')
>>> print(dt1)
int8
>>> print(type(dt1))
<class 'numpy.dtype[int8]'>
語法格式:numpy.array(object, dtype = None, copy = True, order = None,subok=False,ndmin = 0)
參數說明:
>>> import numpy as np
# 列表
>>> t1 = np.array([1,2,3])
>>> print(t1)
[1 2 3]
# 迭代對象
>>> t2 = np.array(range(10))
>>> print(t2)
[0 1 2 3 4 5 6 7 8 9]
>>> print(type(t2))
<class 'numpy.ndarray'>
>>> t3 = np.arange(10)
>>> print(t3)
[0 1 2 3 4 5 6 7 8 9]
>>> print(type(t3))
<class 'numpy.ndarray'>
>>> t4 = np.arange(2,10,2)
>>> print(t4)
[2 4 6 8]
>>> print(type(t4))
<class 'numpy.ndarray'>
注意:arange和range的區別
>>> a = np.array([1,2,3,4,5])
>>> a.dtype
dtype('int32')
NumPy數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2,以此類推
在NumPy中,每一個線性的數組稱為是一個軸(axis) ,也就是維度(dimensions) 。比如說,二維數組相當於是兩個- -維數組,其中第一個一維數組中每個元素又是一個一 維數組。所以一維數組就是NumPy中的軸(axis) ,第一個軸相當於是底層數組,第二個軸是底層數組裡的數組。而軸的數量一一秩,就是數組的維數
很多時候可以聲明axis。axis=O, 表示沿著第0軸進行操作,即對每一列進行操作;axis=1,表示沿著第1軸進行操作,即對每一行進行操作
常用屬性:
1. ndim :
>>> import numpy as np
>>> arr = np.arange(24)
>>> print(arr)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
>>> print(arr.ndim)
1
# 調整維度,li 為三維
>>> li = arr.reshape(2,3,4)
>>> print(li)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
>>> print(li.ndim)
3
2. shape:表示數組的維度,返回一個元組,這個元組的長度就是維度的數目,即ndim屬性(秩)。比
如,一個二維數組,其維度表示"行數"和"列數":
獲取維度
>>> import numpy as np
>>> arr = np.array([[1,2,3],[4,5,6]])
>>> print(arr)
[[1 2 3]
[4 5 6]]
>>> print(arr.shape)
(2, 3)
調整維度
>>> arr.shape = (3,2)
>>> print(arr)
[[1 2]
[3 4]
[5 6]]
>>> print(arr.shape)
(3, 2)
3. 其他屬性:
>>> import numpy as np
>>> arr = np.array([[1,2,3],[4,5,6]])
>>> print(arr.size)
6
>>> print(arr.dtype)
int32
>>> print(arr.itemsize)
4
>>> print(arr.flags)
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
ndarray對象的內容可以通過索引或切片來訪問和修改,與Python中list的切片操作一樣
ndarray數組可以基於0-n的下標進行索引,切片對象可以通過內置的slice函數,並設置start, stop及step參數進行, (從原數組中切割出一個新數組
>>> t = np.arange(0,20).reshape(5,4)
>>> t
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
>>> # 取行
>>> t[0]
array([0, 1, 2, 3])
>>> # 取連續多行
>>> t[:2]
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> t[2:]
array([[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
>>> # 取不連續的多行
>>> t[[2,4]]
array([[ 8, 9, 10, 11],
[16, 17, 18, 19]])
>>> # 取列
>>> t[:,0]
array([ 0, 4, 8, 12, 16])
>>> # 取連續的多列
>>> t[:,:2]
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17]])
>>> t[:,2:]
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]])
>>> # 取不連續多列
>>> t[:,[0,2]]
array([[ 0, 2],
[ 4, 6],
[ 8, 10],
[12, 14],
[16, 18]])
>>> # 取行列(第3行,第4列)
>>> t[2,3]
11
>>> # 取多行多列(第3-5行,第2-4列)
>>> t[2:5,1:4]
array([[ 9, 10, 11],
[13, 14, 15],
[17, 18, 19]])
>>> # 取多個不相鄰的點(0,0)(2,1)
>>> t[[0,2],[0,1]]
array([0, 9])
布爾索引通過布爾運算(如:比較運算符)來獲取符合指定條件的元素的數組
>>> t = np.arange(0,20).reshape(5,4)
>>> t
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
# 布爾索引
>>> t<10
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, False, False],
[False, False, False, False],
[False, False, False, False]])
>>> # 取數組中大於10的值
>>> t[t>10]
array([11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> # 取數組中小於10的值
>>> t[t<10]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy對不同形狀(shape)的數組進行數值計算的方式,對 數組的算術運算通常在相應的元素上進行
形狀相同:如果兩個數組a和b形狀相同,即滿足a.shape == b.shape,那麼a+b的結果就是a與b數組對應位相加。這要求維數相同,且各維度的長度相同
>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> b = np.array([5,6,7,8])
>>> c = a + b
>>> print(c)
[ 6 8 10 12]
形狀不同:如果兩個數組的維數不相同,則元素到元素的操作是不可能的。然而, 在NumPy中仍然
可以對形狀不相似的數組進行操作,因為它擁有廣播功能。較小的數組會廣播到較大數組的大小,以便使它們的形狀可兼容
>>> a = np.array([[0,0],[1,1],[2,2]])
>>> b = np.array([3,3])
>>> print(a+b)
[[3 3]
[4 4]
[5 5]]
廣播的規則:
在numpy中可以理解為方向,使用0,1,2…數字表示,對於一個一維數組,只有一個0軸,對於2維數(shape(2,2)),有0軸和1軸,對於三維數組(shape(2,2,3)),有0,1,2軸
有了軸的概念之後,我們計算會更加方便,比如計算一個2維數組的平均值,必須指定是計算哪個方向上面的數字的平均值
二維數組的軸:
三維數組的軸:
明白了軸的概念之後,對於shape返回的結果和reshape的結果能夠更加清楚