程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

100天精通Python(數據分析篇)——第49天:初識numpy模塊

編輯:Python

文章目錄

  • 每篇前言
  • 一、初識numpy模塊
    • 1. numpy介紹
    • 2. ndarray對象介紹
    • 3. numpy下載
  • 二、numpy模塊的基本使用
    • 1. numpy數據類型
    • 2. 創建數組
    • 3. Ndarray數組屬性
  • 三、元素操作
    • 1. 索引和切片
    • 2. 布爾索引
    • 3. 廣播原則
    • 4. 軸(axis)

每篇前言

  • 作者介紹:Python領域優質創作者、華為雲享專家、阿裡雲專家博主、2021年CSDN博客新星Top6

  • 本文已收錄於Python全棧系列專欄:《100天精通Python從入門到就業》
  • ​​此專欄文章是專門針對Python零基礎小白所准備的一套完整教學,從0到100的不斷進階深入的學習,各知識點環環相扣
  • 訂閱專欄後續可以閱讀Python從入門到就業100篇文章還可私聊進兩百人Python全棧交流群(手把手教學,問題解答);進群可領取80GPython全棧教程視頻 + 300本計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
  • 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!


一、初識numpy模塊

1. numpy介紹

NumPy 是 Python 語言的一個第三方庫,其支持大量高維度數組與矩陣運算。此外,NumPy 也針對數組運算提供大量的數學函數。機器學習涉及到大量對數組的變換和運算,NumPy 就成了必不可少的工具之一。

作用:NumPy是一個運行速度非常快的數學庫,主要用於數組計算

包含

  • 一個強大的N維數組對象ndarray

  • 廣播功能函數

  • 線性代數、傅裡葉變換、隨機數生成等功能

優勢

  • 對於同樣的數值計算任務,使用numpy要比直接編寫Python代碼便捷的多
  • numpy中的數組的存 儲效率和輸入輸出性能均遠遠優於Python中等價的基本數據結構,且其能夠提升性能是與數組中的元素成比例的
  • numpy的大部分代碼都是用C語言寫的,其底層算法在設計時就有著優異的性能,這使得numpy比純Python代碼高效得多

2. ndarray對象介紹

NumPy定義了一個n維數組對象,簡稱ndarray對象,它是一個一系列相同類型元素組成的數組集合。數組中的每個元素都占有大小相同的內存塊

ndarray對象采用了數組的索引機制,將數組中的每個元素映射到內存塊上,並且按照一定的布局對內存塊進行排列(行或列)。

3. numpy下載

1. window電腦點擊win鍵+ R,輸入:cmd

2. 安裝numpy,輸入對應的pip命令pip install numpy,我已經安裝過了出現版本就安裝成功了

3. 導包

import numpy as np

二、numpy模塊的基本使用

1. numpy數據類型

numpy支持的數據類型比Python內置的類型要多很多,基本上可以和C語言的數據類型對應上,其中部分類型對應為Python內置的類型

numpy的數值類型實際上是dtype對象的實例,並對應唯一-的字符, 包括np.bool_ ,np.int32,np.float32, 等等

類型類型代碼說明int8、uint8i1、u1有符號和無符號的8位(1個字節) 整型int16, uint16i2、u2有符號和無符號的16位(2個字節) 整型int32、uint32i4、u4有符號和無符號的32位(4個字節) 整型int64、uint64i8、u8有符號和無符號的64位(8個字節) 整型float16f2半精度浮點數float32f4或者f標准的單精度浮點數。與C的float兼容float64f8或d標准的雙精度浮點數。與C的double 和Python的float對象兼容float1 28f16或g擴展精度浮點數complex64. complex128.c8、c16分別用兩個32位、64位或128位浮點數表示的complex256c32復數boolb存儲True和False值的布爾類型

數據類型對象是用來描述與數組對應的內存區域如何使用,這依賴如下幾個方面:

  • 數據的類型(整數,浮點數或者Python對象)
  • 數據的大小(例如, 整數使用多少個字節存儲)
  • 數據的字節順序(小端法或大端法) [通過對數據類型預先設定"<“或”>"來決定的。<“意味著小端法(最小值存儲在最小的地址,即低位組放在最前面)。”>"意味著大端法(最重要的字節存儲在最小的地址,即高位組放在最前面)]
  • 在結構化類型的情況下,字段的名稱、每個字段的數據類型和每個字段所取的內存塊的
    部分
  • 如果數據類型是子數組,它的形狀和數據類型

創建數據類型對象語法numpy.dtype(object, align, copy)

參數說明

  • object:要轉換為的數據類型對象
  • align:如果為true,填充字段使其類似C的結構體
  • copy:復制dtype對象,如果為false,則是對內置數據類型對象的引用.

基本使用

>>> 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]'>

2. 創建數組

語法格式numpy.array(object, dtype = None, copy = True, order = None,subok=False,ndmin = 0)

參數說明

  • object:表示一個數組序列。
  • dtype :可選參數,通過它可以更改數組的數據類型
  • copy:可選參數,當數據源是ndarray時表示數組能否被復制,默認是True。
  • order:可選參數,以哪種內存布局創建數組,有3個可選值,分別是C(行序列)/F(列序列)/A(默認)。
  • ndmin:可選參數,用於指定數組的維度。
  • subok:可選參數,類型為boo值,默認False。 為True, 使用object的內部數據類型; False: 使用object數組的數據類型。
>>> 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')

3. Ndarray數組屬性

NumPy數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2,以此類推

在NumPy中,每一個線性的數組稱為是一個軸(axis) ,也就是維度(dimensions) 。比如說,二維數組相當於是兩個- -維數組,其中第一個一維數組中每個元素又是一個一 維數組。所以一維數組就是NumPy中的軸(axis) ,第一個軸相當於是底層數組,第二個軸是底層數組裡的數組。而軸的數量一一秩,就是數組的維數

很多時候可以聲明axis。axis=O, 表示沿著第0軸進行操作,即對每一列進行操作;axis=1,表示沿著第1軸進行操作,即對每一行進行操作

常用屬性:

屬性說明ndim秩,即軸的數量或維度的數量shape數組的維度,對於矩陣,n行m列size數組元素的總個數,相當於.shape中n*m的值dtypendarray對象的元素類型itemsizendarray對象中每個元素的大小,以字節為單位flagsndarray對象的內存信息realndarray元素的實部imagndarray元素的虛部data包含實際數組元素的緩沖區,由於-般通過數組的索引獲取元素,所以通常不需要使用這個屬性

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

三、元素操作

1. 索引和切片

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])

2. 布爾索引

布爾索引通過布爾運算(如:比較運算符)來獲取符合指定條件的元素的數組

>>> 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])

3. 廣播原則

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]]

廣播的規則

  • 讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加1補
  • 輸出數組的形狀是輸入數組形狀的各個維度上的最大值
  • 如果輸入數組的某個維度和輸出數組的對應維度的長度相同或者其長度為1時,這個數
    組能夠用來計算,否則出錯
  • 當輸入數組的某個維度的長度為1時,沿著此維度運算時都用此維度上的第-組值

4. 軸(axis)

在numpy中可以理解為方向,使用0,1,2…數字表示,對於一個一維數組,只有一個0軸,對於2維數(shape(2,2)),有0軸和1軸,對於三維數組(shape(2,2,3)),有0,1,2軸

有了軸的概念之後,我們計算會更加方便,比如計算一個2維數組的平均值,必須指定是計算哪個方向上面的數字的平均值

二維數組的軸:

三維數組的軸:


明白了軸的概念之後,對於shape返回的結果和reshape的結果能夠更加清楚


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved