Numpy基礎20問

點擊藍字關注我,有乾貨領取!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函數還能返回重複元素的索引、計數等信息,可去查文檔自定義參數。


未完待續!

參考資料

[1]

numpy文檔: https://www.numpy.org.cn/

[2]

菜鳥教程: https://www.runoob.com/numpy/numpy-tutorial.html



-END-

TIPS

加入【Python數據分析】知識星球,帶你走完數據科學流程!


往期精選

 

conda+jupyter玩轉數據科學環境搭建

用Python編寫小工具下載OSM路網數據

教你使用Python玩轉MySQL數據庫,大數據導入再也不是難題!


Python大數據分析

data creats value

長按二維碼關注

本文分享自微信公衆號 - Python大數據分析(pydatas)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索