一、關(guān)于NumPy的介紹:
? NumPy是Numerical Python的縮寫,是python數(shù)值計算的基石。它提供多種數(shù)據(jù)結(jié)構(gòu)、算法以及大部分涉及Python數(shù)值計算所需的接口。NumPy還包括其他內(nèi)容:
- 快速、高效的多維數(shù)組對象ndarray
- 基于元素的數(shù)組計算或數(shù)組間數(shù)學(xué)操作函數(shù)
- 用于讀寫硬盤中基于數(shù)組的數(shù)據(jù)集的工具
- 線性代數(shù)操作、傅立葉變換以及隨機數(shù)生成
- 成熟的C語言API,允許Python拓展和本地的C或C++代碼訪問NumPy的數(shù)據(jù)結(jié)構(gòu)和計算設(shè)施
? 除了NumPy賦予Python的快速數(shù)組處理能力以外,NumPy的另外一個主要的用途在算法和庫之間作為數(shù)據(jù)傳遞的數(shù)據(jù)容器。對于數(shù)據(jù)數(shù)據(jù),NumPy數(shù)組能夠比Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)更高效地存儲和操作數(shù)據(jù)。此外,用底層語言編寫的庫,例如用C或Fortran編寫的庫,可以在NumPy數(shù)組存儲的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)上直接操作,而無須將數(shù)據(jù)復(fù)制到其他內(nèi)存中后再操作。因此,許多Python的數(shù)值計算工具將NumPy數(shù)組作為基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),或與NumPy進行無縫互操作。
? NumPy大多數(shù)被應(yīng)用在數(shù)據(jù)分析上,能夠?qū)?shù)據(jù)做一些處理,比如:數(shù)據(jù)處理、清洗、過濾等。除此之外,還可用于數(shù)據(jù)算法、統(tǒng)計等。
二、多維數(shù)組(NumPy ndarray):
? NumPy的核心特征之一就是N-維數(shù)組對象——ndarray。ndarray是Python中一個快速、靈活的大型數(shù)據(jù)集容器。數(shù)據(jù)允許你使用類似于標量的操作語法在整塊數(shù)據(jù)上進行數(shù)學(xué)計算。
1、創(chuàng)建數(shù)組
? 在此之前,我們使用標準的NumPy導(dǎo)入的方式import numpy as np。你當然也可以使用其他的方式導(dǎo)入,然而我還是建議使用標準導(dǎo)入的方式。
? 創(chuàng)建數(shù)組的方式有以下兩種,所創(chuàng)建的數(shù)組維度是有區(qū)別的。
第一種方式:使用array函數(shù)。array函數(shù)接收任意的序列型對象(當然包括數(shù)組),生成一個新的包含傳遞數(shù)據(jù)的NumPy數(shù)組。例如:
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
# 創(chuàng)建數(shù)組方式一:使用array函數(shù)
my_list1 = [1, 2, 3, 4, 5, 6]
my_data1 = np.array(my_list1)
my_data1
# 運行結(jié)果:
# array([1, 2, 3, 4, 5, 6])
嵌套序列,例如等長度的嵌套列表,將自動轉(zhuǎn)換成多位數(shù)組:
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
# 創(chuàng)建數(shù)組方式一:使用array函數(shù),傳入嵌套序列
my_list2 =[ [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
my_data2 = np.array(my_list2)
my_data2
# 運行結(jié)果:
# array([[ 1, 2, 3, 4, 5, 6],
# [ 7, 8, 9, 10, 11, 12]])
第二種方式:利用np.arange創(chuàng)建,返回一個數(shù)組結(jié)果,使用該方法只能創(chuàng)建一維數(shù)組,但是我們可是使用reshape方法將其轉(zhuǎn)化為多維數(shù)組。
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
# 創(chuàng)建數(shù)組方式二:利用np.arange創(chuàng)建
data = np.arange(10)
data
# 運行結(jié)果:
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 通過reshape變形其排列方式,轉(zhuǎn)化為多位數(shù)組
data = np.arange(10).reshape(3,3)
# 運行結(jié)果:
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
一般采用 np.arange().reshape() 來創(chuàng)建多維數(shù)組,比較方便快捷。在創(chuàng)建時,使用元組或者列表都是可行的,即小括號中括號是沒有區(qū)別的,都能達到創(chuàng)建數(shù)組的目的。
除了np.array,還有很多其他函數(shù)可以創(chuàng)建新數(shù)組,例如,給定長度及形狀后,zeros可以一次性創(chuàng)建全0的數(shù)組,ones可以一次性創(chuàng)建全1的數(shù)組。empty則可以創(chuàng)建一個沒有初始化數(shù)值的數(shù)組。
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
# 全0的數(shù)組
data1 = np.zeros(10)
data1
# 運行結(jié)果:
# array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 全1的數(shù)組
data2 = np.zeros(10)
data2
# 運行結(jié)果:
# array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 沒有初始值的數(shù)組
data3 = np.empty((2, 3, 2))
data3
# 運行結(jié)果:
# array([[[0.00000000e+000, 2.00000013e+000],
# [2.96439388e-323, 0.00000000e+000],
# [4.57668571e-072, 2.46567317e+179]],
# [[6.20015184e-091, 1.48575047e-076],
# [1.26863781e-076, 3.22179210e-057],
# [3.99910963e+252, 8.57853230e-309]]])
# 指定值的數(shù)組
data4 = np.full((2, 3), 2)
data4
# 運行結(jié)果:
# array([[2, 2, 2],
# [2, 2, 2]])
使用np.empty來生成全0的數(shù)組并不安全,有時候可能會返回為初始化的垃圾數(shù)據(jù)。
2、數(shù)組常用屬性:
shape方法:可用來查看數(shù)據(jù)的維度信息
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
data = np.arange(20).reshape(4,5)
# shape方法:可用來查看數(shù)據(jù)的維度信息
data.shape
# 運行結(jié)果:
# (4, 5)
size方法:可以查看數(shù)組元素的個數(shù)
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
data = np.arange(20).reshape(4,5)
# size方法:可以查看數(shù)組元素的個數(shù)
data.size
# 運行結(jié)果:
# 20
dtype方法:可以查看數(shù)組的數(shù)據(jù)類型,數(shù)據(jù)類型的顯示會因Ipython版本的不同而有所差異。
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
data = np.arange(20).reshape(4,5)
# dtype方法:可以查看數(shù)組的數(shù)據(jù)類型,數(shù)據(jù)類型的顯示會因Ipython版本的不同而有所差異。
data.dtype
# 運行結(jié)果:
# dtype('int64')
數(shù)據(jù)類型:
NumPy中默認的數(shù)據(jù)類型是float64。
下面是numpy支持的數(shù)據(jù)類型:
bool 用一位存儲的布爾類型(值為 TRUE 或 FALSE )
inti 由所在平臺決定其精度的整數(shù)(一般為 int32 或 int64 )
int8 整數(shù),范圍為128至127
int16 整數(shù),范圍為-32768至32767
int32 整數(shù),范圍為-2^31 至2^31-1
int64 整數(shù),范圍為-2^63 至2^63-1
uint8 無符號整數(shù),范圍為0至255
uint16 無符號整數(shù),范圍為0至65535
uint32 無符號整數(shù),范圍為0至2^32-1
uint64 無符號整數(shù),范圍為0至2^64 -1
float16 半精度浮點數(shù)(16位):其中用1位表示正負號,5位表示指數(shù),10位表示尾數(shù)
float32 單精度浮點數(shù)(32位):其中用1位表示正負號,8位表示指數(shù),23位表示尾數(shù)
float64 或 float 雙精度浮點數(shù)(64位):其中用1位表示正負號,11位表示指數(shù),52位表示尾數(shù)
complex64 復(fù)數(shù),分別用兩個32位浮點數(shù)表示實部和虛部
complex128 或 complex 復(fù)數(shù),分別用兩個64位浮點數(shù)表示實部和虛部
在創(chuàng)建數(shù)組時,我們可以自己設(shè)定數(shù)組數(shù)據(jù)類型,如果不設(shè)定,Numpy會根據(jù)所創(chuàng)建得內(nèi)容自行判斷數(shù)據(jù)類型。例如:
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
data = np.arange(20).reshape(4,5)
data.dtype
# 運行結(jié)果:
# dtype('int64')
創(chuàng)建數(shù)組時設(shè)定numpy指定的數(shù)據(jù)類型,只需設(shè)定參數(shù) dtype='數(shù)據(jù)類型',通常如果沒有特別要求或者對數(shù)據(jù)的存儲類型不限定時,不用特別強調(diào)數(shù)據(jù)類型。
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
data = np.arange(20, dtype='int32').reshape(4,5) # 設(shè)定參數(shù) dtype='數(shù)據(jù)類型'
data.dtype
# 運行結(jié)果:
# dtype('int32')
數(shù)組的數(shù)據(jù)類型之間是可以轉(zhuǎn)換的,可以使用以下兩種方法:
# 使用NumPy的標準導(dǎo)入方式導(dǎo)入numpy庫
import numpy as np
# 方式一:
data = np.arange(20, dtype='int32').reshape(4,5)
data.dtype
# 運行結(jié)果:
# dtype('int32')
# 方式二:
data1 = np.arange(20, dtype='int32').reshape(4,5)
data1.dtype = 'float64'
data1.dtype
# 運行結(jié)果:
# dtype('float32')