點擊藍字關注我,有乾貨領取!html
一、什麼是numpy?
一言以蔽之,numpy是python中基於數組對象的科學計算庫。python
提煉關鍵字,能夠得出numpy如下三大特色:web
-
擁有n維數組對象; -
擁有廣播功能(後面講到); -
擁有各類科學計算API,任你調用;
二、如何安裝numpy?
由於numpy是一個python庫,因此使用python包管理工具pip或者conda均可以安裝。數據庫
安裝python後,打開cmd命令行,輸入:數組
pip install numpy
便可完成安裝。微信
三、什麼是n維數組對象?
n維數組(ndarray)對象,是一系列同類數據的集合,能夠進行索引、切片、迭代操做。app
numpy中可使用array
函數建立數組:dom
import numpy as np
np.array([1,2,3])
# 輸出:array([1, 2, 3])
四、如何區分一維、二維、多維?
判斷一個數組是幾維,主要是看它有幾個軸(axis)。編輯器
一個軸表示一維數組,兩個軸表示二維數組,以此類推。函數
每一個軸都表明一個一維數組。
好比說,二維數組第一個軸裏的每一個元素都是一個一維數組,也就是第二個軸。
一維數組一個軸:
[1,2,3]
二維數組兩個軸:
[[0, 1, 2],
[3, 4, 5]]
三維數組三個軸:
[[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]]
以此類推n維數組。
五、如何建立n維數組?
numpy中經常使用array
函數建立數組,傳入列表或元組便可。
建立一維數組,並指定數組類型爲int
:
import numpy as np
np.array([1,2,3],dtype=int)
# 輸出:array([1, 2, 3])
建立二維數組:
import numpy as np
np.array(((1,2),(3,4)))
'''
輸出:
array([[1, 2],
[3, 4]])
'''
還可使用arange
函數建立一維數字數組,用法相似python的range
函數.
import numpy as np
np.arange(1,6)
'''
輸出:array([1, 2, 3, 4, 5])
'''
六、如何建立隨機數組?
numpy的random
模塊用來建立隨機數組。
-
random.rand
函數,生成[0,1)均勻分佈的隨機數組
import numpy as np
# 建立2行2列取值範圍爲[0,1)的數組
np.random.rand(2,2)
'''
輸出:
array([[0.99449146, 0.92339551],
[0.1837405 , 0.41719798]])
'''
-
random.randn
函數,生成數值成標準正態分佈(平均值爲0,標準差爲1)的數組
import numpy as np
# 建立2行3列,取值範圍爲標準正態分佈的數組
np.random.randn(3,2)
'''
輸出:
array([[-1.27481003, -1.5888111 ],
[ 0.16985203, -2.91526479],
[ 1.75992671, -2.81304831]])
'''
-
random.randint
函數,生成能夠指定範圍的隨機整數數組
import numpy as np
# 建立2行2列,取值範圍爲[2,10)的隨機整數數組
np.random.randint(2,10,size=(2,2))
'''
輸出:
array([[5, 4],
[3, 7]])
'''
-
random.normal
函數,生成數值成正態分佈(可指定平均值、標準差)的數組
import numpy as np
# 建立一維,數值成正態分佈(均值爲1,標準差爲2)的數組
# 參數loc表明均值,scale表明標準差
np.random.normal(loc=1,scale=2,size=5)
'''
輸出:
array([ 0.82962241, 0.41738042, 0.0470862 , 1.79446076, -1.47514478])
'''
random模塊還有其餘函數,這裏很少說。
七、如何查看數組的維度?
前面說到,數組維度即表明軸的數量。
咱們能夠經過數組(ndarray)對象的ndim或shape屬性,來查看軸的數量。
-
ndim屬性直接返回維度值; -
shape屬性返回一個元組,元組的長度即表明維度值,裏面的數字從左往右分別表明每一軸的元素數量。
import numpy as np
# 建立一維數組
x1 = np.array([1,2,3])
# 返回維度值
x1.ndim
'''
輸出:1
'''
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 返回形狀
x2.shape
'''
輸出:(2, 3)
元素長度爲2表明二維,
元素2表明0軸有兩個元素,
元素3表明1軸有3個元素。
'''
八、如何查看數組有多少個元素?
數組(ndarray)對象的size
屬性能夠查看數組包含元素總數。
import numpy as np
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 查看元素總數
x2.size
'''
輸出:6
'''
還能夠經過shape
屬性返回元素的乘積,來計算數組元素數量。
import numpy as np
from functools import reduce
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 查看元素總數
reduce(lambda x,y:x*y , x2.shape)
'''
輸出:6
shape形狀:
(2,3)
'''
九、Numpy數組支持哪些數據類型?
Numpy支持的數據類型很是多,因此很適合作數值計算。下面給出常見的數據類型:
十、如何查看數組的類型?
數組(ndarrry)對象提供dtype
屬性,用來查看數組類型。
import numpy as np
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]],dtype=int)
# 返回類型
x2.dtype
'''
輸出:dtype('int32')
'''
十一、如何改變數組的形狀?
前面說過,數組的shape
屬性返回一個元組,可以反映數組的形狀,包括維度以及每一個軸的元素數量。
那麼若是給定一個數組,怎麼改變其形狀呢?
經常使用的方式有兩種:
-
reshape
方法,它返回一個新的數組,而不能改變原始數組。 -
resize
方法,無返回值,它更改了原始數組。
好比說我要將一個二維數組轉換爲三維數組。
import numpy as np
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 將x2轉換爲三維數組,而且自定義每一個軸的元素數量
x2.reshape(1,2,3)
'''
輸出:
array([[[1, 2, 3],
[4, 5, 6]]])
'''
reshape
方法能夠傳入整數或者元組形式的參數。
傳入的參數和shape
屬性返回的元組的含義是同樣的。
例如, x2.reshape(1,2,3)
是將二維數組轉換成三維數組,參數個數表明要轉換的維度,參數數字從左到右分別表示0軸、1軸、2軸的元素數量。
resize
方法和reshape
方法使用形式同樣,區別是resize
方法改變了原始數組形狀。
import numpy as np
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 將x2轉換爲三維數組,而且自定義每一個軸的元素數量
x2.resize((1,2,3))
x2
'''
輸出:
array([[[1, 2, 3],
[4, 5, 6]]])
'''
十二、如何對數組進行索引和切片操做?
numpy一維數組的索引和切片操做相似python列表,這裏很少講。
好比說取一維數組前三個元素。
import numpy as np
# 建立一維數組
x1 = np.array([1,2,3,4])
# 切片,取前三個元素
x1[:3]
'''
輸出:
array([1, 2, 3])
'''
重點是對多維數組的索引和切片。
多維數組有多個軸,那麼就須要對每一個軸進行索引。
例如,三維數組形狀爲(x,y,z),分別表明:0軸有x個元素、1軸有y個元素,2軸有z個元素。
對0、一、2軸進行索引,若是取o軸第2個元素、1軸第0個元素、2軸第3個元素,那麼索引形式就爲[2,0,3]。
import numpy as np
# 建立三維數組
x3 = np.arange(24).reshape(3,2,4)
# 對該三維數組進行索引
x3[2,0,3]
'''
輸出:19
三維數組形式:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
'''
切片也是一樣道理。
若是取o軸前2個元素、1軸前1個元素、2軸後2個元素,那麼切片形式就爲[:2,:1,-2:]。
import numpy as np
# 建立三維數組
x3 = np.arange(24).reshape(3,2,4)
# 對該三維數組進行切片
x3[:2,:1,-2:]
'''
輸出:
array([[[ 2, 3]],
[[10, 11]]])
三維數組形式:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
'''
1三、如何對數組裏每一個元素進行迭代?
說到迭代,你們很容易想到直接對數組直接使用for
循環操做,對於一維數組來講,固然是能夠的。
import numpy as np
# 建立一維數組
x1 = np.array([1,2,3,4])
# 迭代
for i in x1:
print(i)
'''
輸出:
1
2
3
4
'''
但對於多維數組,迭代是相對於0軸完成的,就是多維數組最外層的那一維。
你沒有辦法直接遍歷數組裏每個元素,嵌套循環又過低效。
這個時候就須要用到flat
方法,它能夠將多維數組平鋪爲一維的迭代器。
import numpy as np
# 建立二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 先平鋪,再迭代
for i in x2.flat:
print(i)
'''
輸出:
1
2
3
4
5
6
'''
1四、如何將多維數組展開爲一維數組?
數組(ndarray)對象提供了ravel方法,用來將多維數組展開爲一維數組。
import numpy as np
# 建立er維數組
x3 = np.arange(12).reshape(3,4)
# 對該三維數組進行索引
x3.ravel()
'''
輸出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
'''
1五、什麼廣播機制?
廣播(Broadcast)是 numpy 對不一樣形狀(shape)的數組進行數值計算的方式, 對多個數組的算術運算一般在相應的元素上進行。
較小的數組在較大的數組上「廣播」,以便它們具備兼容的形狀。
好比說一個一維數組乘以一個數字,至關於一維數組裏每一個元素都乘以這個數。
import numpy as np
# 建立一維數組
x1 = np.array([1,2,3])
# 廣播
x1 * 2
'''
輸出:
array([2, 4, 6])
'''
若是相同維度的數組進行運算,其shape相同,那麼廣播就是兩個數組相同位數的元素進行運算。
import numpy as np
# 建立一維數組
x1 = np.array([1,2,3])
x2 = np.array([4,5,6])
# 廣播
x1 + x2
'''
輸出:
array([5, 7, 9])
'''
若是兩個數組維度不一樣,進行運算,這裏就觸發了廣播的兩個規則。
-
讓全部輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都經過在前面加 1 補齊; -
當輸入數組的某個維度的長度爲 1 時,沿着此維度運算時都用此維度上的第一組值。
這兩個規則保證了不一樣維度數組進行運算時,其維度自動調整成一致。
import numpy as np
# 建立一維數組
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([2,3,4])
# 廣播
x1 - x2
'''
輸出:
array([[-1, -1, -1],
[ 2, 2, 2]])
'''
1六、numpy中如何進行數值舍入操做?
-
around
函數,用於四捨五入,返回一個新數組
import numpy as np
# 建立一維數組
x1 = np.array([1.45,2.78,3.12])
# 四捨五入,到小數點後1位
np.around(x1,1)
'''
輸出:
array([1.4, 2.8, 3.1])
'''
-
floor
函數,用於向下取整,返回一個新數組
import numpy as np
# 建立一維數組
x1 = np.array([1.45,2.78,3.12])
# 向下取整
np.floor(x1)
'''
輸出:
array([1., 2., 3.])
'''
-
ceil
函數,用於向上取整,返回一個新數組
import numpy as np
# 建立一維數組
x1 = np.array([1.45,2.78,3.12])
# 向下取整
np.ceil(x1)
'''
輸出:
array([2., 3., 4.])
'''
1七、如何對數組進行轉置操做?
numpy提供了transpose
函數用以對數組進行維度的調換,也就是轉置操做。
轉置後返回一個新數組。
import numpy as np
# 建立二維數組
x1 = np.arange(12).reshape(3,4)
# 轉置
np.transpose(x1)
'''
輸出:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
原數組:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
固然,能夠用更簡單的方法。
數組對象提供了T
方法,用於轉置,一樣會返回一個新數組。
import numpy as np
# 建立二維數組
x1 = np.arange(12).reshape(3,4)
# 轉置
x1.T
'''
輸出:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
原數組:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
1八、如何鏈接兩個相同維度的數組?
numpy的concatenate
函數用於沿指定軸鏈接相同形狀的兩個或多個數組。
import numpy as np
# 建立兩個二維數組
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([[7,8,9],[10,11,12]])
# 鏈接,默認沿0軸鏈接
np.concatenate((x1,x2))
'''
輸出:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
'''
# 指定沿1軸鏈接
np.concatenate((x1,x2),axis=1)
'''
輸出:
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
'''
1九、如何向數組添加值?
-
numpy的 append
函數向數組末尾追加值,能夠指定不一樣的軸。
import numpy as np
# 建立一個二維數組
x1 = np.array([[1,2,3],[4,5,6]])
# 直接向數組末尾添加元素,返回平鋪的一維數組
np.append(x1,[7,8,9])
'''
輸出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
'''
# 沿軸 0 添加元素
np.append(x1, [[7,8,9]],axis = 0)
'''
輸出:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
'''
# 沿軸 1 添加元素
np.append(x1, [[5,5,5],[7,8,9]],axis = 1)
'''
輸出:
array([[1, 2, 3, 5, 5, 5],
[4, 5, 6, 7, 8, 9]])
'''
-
numpy的 insert
函數能夠沿給定軸,在數組中任意位置插入數據。
import numpy as np
# 建立一個二維數組
x1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 直接在指定位置插入元素,返回平鋪的一維數組
np.insert(x1,2,[0,0,0])
'''
輸出:
array([1, 2, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9])
原數組:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
'''
# 指定位置,沿軸 0 插入元素
np.insert(x1,1,[0,0,0],axis=0)
'''
輸出:
array([[1, 2, 3],
[0, 0, 0],
[4, 5, 6],
[7, 8, 9]])
'''
# 指定位置,沿軸 1插入元素
np.insert(x1,2,[0,0,0],axis=1)
'''
輸出:
array([[1, 2, 0, 3],
[4, 5, 0, 6],
[7, 8, 0, 9]])
'''
20、如何對數組進行去重操做?
numpy的unique
函數用於去除數組中的重複元素,返回一個新數組。
import numpy as np
# 建立一個一維數組
x1 = np.array([2,3,5,1,3,8,1,0])
np.unique(x1)
'''
輸出:
array([0, 1, 2, 3, 5, 8])
'''
unique
函數還能返回重複元素的索引、計數等信息,可去查文檔自定義參數。
未完待續!
參考資料
numpy文檔: https://www.numpy.org.cn/
[2]菜鳥教程: https://www.runoob.com/numpy/numpy-tutorial.html
-END-
TIPS
加入【Python數據分析】知識星球,帶你走完數據科學流程!
往期精選
Python大數據分析
data creats value
長按二維碼關注
本文分享自微信公衆號 - Python大數據分析(pydatas)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。