日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NumPy 笔记(超级全!收藏√)

發(fā)布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NumPy 笔记(超级全!收藏√) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • NumPy 教程
  • NumPy Ndarray 對象
  • NumPy 數(shù)據(jù)類型
    • 數(shù)據(jù)類型對象 (dtype)
  • NumPy 讀取數(shù)據(jù)
  • NumPy 數(shù)組屬性
      • ndarray.ndim
      • ndarray.shape
      • ndarray.itemsize
      • ndarray.flags
  • NumPy 創(chuàng)建數(shù)組
      • numpy.empty
      • numpy.zeros
      • numpy.ones
  • NumPy 從已有的數(shù)組創(chuàng)建數(shù)組
      • numpy.asarray
      • numpy.frombuffer
      • numpy.fromiter
  • NumPy 從數(shù)值范圍創(chuàng)建數(shù)組
      • numpy.arange
      • numpy.linspace
      • numpy.logspace
  • NumPy 切片和索引
  • NumPy 高級索引
      • 布爾索引
      • 花式索引
  • NumPy 廣播(Broadcast)
      • 廣播的規(guī)則:
  • NumPy 迭代數(shù)組
      • 控制遍歷順序
      • 修改數(shù)組中元素的值
      • 使用外部循環(huán)
      • 廣播迭代
    • 修改數(shù)組形狀
      • numpy.reshape
      • numpy.ndarray.flat
      • numpy.ndarray.flatten
      • numpy.ravel
    • 翻轉(zhuǎn)數(shù)組
      • numpy.transpose
      • numpy.rollaxis
      • numpy.swapaxes
    • 修改數(shù)組維度
      • numpy.broadcast
      • numpy.broadcast_to
      • numpy.expand_dims
      • numpy.squeeze
    • 連接數(shù)組
      • numpy.concatenate
      • numpy.stack
      • numpy.hstack
      • numpy.vstack
    • 分割數(shù)組
      • numpy.split
      • numpy.hsplit
      • numpy.vsplit
    • 數(shù)組元素的添加與刪除
      • numpy.resize
      • numpy.append
      • numpy.insert
      • numpy.delete
      • numpy.unique
  • NumPy 位運算
      • bitwise_and
      • bitwise_or
      • invert
      • left_shift
      • right_shift
  • NumPy 字符串函數(shù)
      • numpy.char.add()
      • numpy.char.multiply()
      • numpy.char.center()
      • numpy.char.capitalize()
      • numpy.char.title()
      • numpy.char.lower()
      • numpy.char.upper()
      • numpy.char.split()
      • numpy.char.splitlines()
      • numpy.char.strip()
      • numpy.char.join()
      • numpy.char.replace()
      • numpy.char.encode()
      • numpy.char.decode()
  • NumPy 數(shù)學函數(shù)
      • 三角函數(shù)
      • 舍入函數(shù)
      • numpy.floor()
      • numpy.ceil()
  • NumPy 算術(shù)函數(shù)
      • numpy.reciprocal()
      • numpy.power()
      • numpy.mod()
  • NumPy 統(tǒng)計函數(shù)
      • numpy.amin() 和 numpy.amax()
      • numpy.ptp()
      • numpy.percentile()
      • numpy.median()
      • numpy.mean()
      • numpy.average()
      • 標準差
      • 方差
  • NumPy 排序、條件刷選函數(shù)
      • numpy.sort()
      • numpy.argsort()
      • numpy.lexsort()
      • msort、sort_complex、partition、argpartition
      • numpy.argmax() 和 numpy.argmin()
      • numpy.nonzero()
      • numpy.where()
      • numpy.extract()
  • NumPy 字節(jié)交換
      • numpy.ndarray.byteswap()
  • NumPy 副本和視圖
      • 無復制
      • 視圖或淺拷貝
      • 副本或深拷貝
    • Python append() 與深拷貝、淺拷貝
      • 深淺拷貝
  • NumPy 矩陣庫(Matrix)
      • matlib.empty()
      • numpy.matlib.zeros()
      • numpy.matlib.ones()
      • numpy.matlib.eye()
      • numpy.matlib.identity()
      • numpy.matlib.rand()
  • NumPy 線性代數(shù)
      • numpy.dot()
      • numpy.vdot()
      • numpy.inner()
      • numpy.matmul
      • numpy.linalg.det()
      • numpy.linalg.solve()
      • numpy.linalg.inv()
  • NumPy IO
      • numpy.save()
      • numpy.savez
      • numpy.savetxt()

NumPy 教程

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學函數(shù)庫。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協(xié)作者共同開發(fā),2005 年,Travis Oliphant 在 Numeric 中結(jié)合了另一個同性質(zhì)的程序庫 Numarray 的特色,并加入了其它擴展而開發(fā)了 NumPy。NumPy 為開放源代碼并且由許多協(xié)作者共同維護開發(fā)。

NumPy 是一個運行速度非常快的數(shù)學庫,主要用于數(shù)組計算,包含:

  • 一個強大的N維數(shù)組對象 ndarray
  • 廣播功能函數(shù)
  • 整合 C/C++/Fortran 代碼的工具
  • 線性代數(shù)、傅里葉變換、隨機數(shù)生成等功能

NumPy Ndarray 對象

NumPy 最重要的一個特點是其 N 維數(shù)組對象 ndarray,它是一系列同類型數(shù)據(jù)的集合,以 0 下標為開始進行集合中元素的索引。

ndarray 對象是用于存放同類型元素的多維數(shù)組。

ndarray 中的每個元素在內(nèi)存中都有相同存儲大小的區(qū)域。

ndarray 內(nèi)部由以下內(nèi)容組成:

  • 一個指向數(shù)據(jù)(內(nèi)存或內(nèi)存映射文件中的一塊數(shù)據(jù))的指針。
  • 數(shù)據(jù)類型或 dtype,描述在數(shù)組中的固定大小值的格子。
  • 一個表示數(shù)組形狀(shape)的元組,表示各維度大小的元組。
  • 一個跨度元組(stride),其中的整數(shù)指的是為了前進到當前維度下一個元素需要"跨過"的字節(jié)數(shù)。

ndarray 的內(nèi)部結(jié)構(gòu):

跨度可以是負數(shù),這樣會使數(shù)組在內(nèi)存中后向移動,切片中 obj[::-1]obj[:,::-1] 就是如此。

創(chuàng)建一個 ndarray 只需調(diào)用 NumPy 的 array 函數(shù)即可:

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

參數(shù)說明:

名稱描述
object數(shù)組或嵌套的數(shù)列
dtype數(shù)組元素的數(shù)據(jù)類型,可選
copy對象是否需要復制,可選
order創(chuàng)建數(shù)組的樣式,C為行方向,F為列方向,A為任意方向(默認)
subok默認返回一個與基類類型一致的數(shù)組
ndmin指定生成數(shù)組的最小維度

ndarray 對象由計算機內(nèi)存的連續(xù)一維部分組成,并結(jié)合索引模式,將每個元素映射到內(nèi)存塊中的一個位置。內(nèi)存塊以行順序(C樣式)或列順序(FORTRAN或MatLab風格,即前述的F樣式)來保存元素

NumPy 數(shù)據(jù)類型

numpy 支持的數(shù)據(jù)類型比 Python 內(nèi)置的類型要多很多,基本上可以和 C 語言的數(shù)據(jù)類型對應上,其中部分類型對應為 Python 內(nèi)置的類型。下表列舉了常用 NumPy 基本類型。

名稱描述
bool_布爾型數(shù)據(jù)類型(True 或者 False)
int_默認的整數(shù)類型(類似于 C 語言中的 long,int32 或 int64)
intc與 C 的 int 類型一樣,一般是 int32 或 int 64
intp用于索引的整數(shù)類型(類似于 C 的 ssize_t,一般情況下仍然是 int32 或 int64)
int8字節(jié)(-128 to 127)
int16整數(shù)(-32768 to 32767)
int32整數(shù)(-2147483648 to 2147483647)
int64整數(shù)(-9223372036854775808 to 9223372036854775807)
uint8無符號整數(shù)(0 to 255)
uint16無符號整數(shù)(0 to 65535)
uint32無符號整數(shù)(0 to 4294967295)
uint64無符號整數(shù)(0 to 18446744073709551615)
float_float64 類型的簡寫
float16半精度浮點數(shù),包括:1 個符號位,5 個指數(shù)位,10 個尾數(shù)位
float32單精度浮點數(shù),包括:1 個符號位,8 個指數(shù)位,23 個尾數(shù)位
float64雙精度浮點數(shù),包括:1 個符號位,11 個指數(shù)位,52 個尾數(shù)位
complex_complex128 類型的簡寫,即 128 位復數(shù)
complex64復數(shù),表示雙 32 位浮點數(shù)(實數(shù)部分和虛數(shù)部分)
complex128復數(shù),表示雙 64 位浮點數(shù)(實數(shù)部分和虛數(shù)部分)

numpy 的數(shù)值類型實際上是 dtype 對象的實例,并對應唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

數(shù)據(jù)類型對象 (dtype)

數(shù)據(jù)類型對象是用來描述與數(shù)組對應的內(nèi)存區(qū)域如何使用,這依賴如下幾個方面:

  • 數(shù)據(jù)的類型(整數(shù),浮點數(shù)或者 Python 對象)
  • 數(shù)據(jù)的大小(例如, 整數(shù)使用多少個字節(jié)存儲)
  • 數(shù)據(jù)的字節(jié)順序(小端法或大端法)
  • 在結(jié)構(gòu)化類型的情況下,字段的名稱、每個字段的數(shù)據(jù)類型和每個字段所取的內(nèi)存塊的部分
  • 如果數(shù)據(jù)類型是子數(shù)組,它的形狀和數(shù)據(jù)類型

字節(jié)順序是通過對數(shù)據(jù)類型預先設(shè)定"<“或”>“來決定的。”<“意味著小端法(最小值存儲在最小的地址,即低位組放在最前面)。”>"意味著大端法(最重要的字節(jié)存儲在最小的地址,即高位組放在最前面)。

dtype 對象是使用以下語法構(gòu)造的:

numpy.dtype(object, align, copy)
  • object - 要轉(zhuǎn)換為的數(shù)據(jù)類型對象
  • align - 如果為 true,填充字段使其類似 C 的結(jié)構(gòu)體。
  • copy - 復制 dtype 對象 ,如果為 false,則是對內(nèi)置數(shù)據(jù)類型對象的引用

每個內(nèi)建類型都有一個唯一定義它的字符代碼,如下:

字符對應類型
b布爾型
i(有符號) 整型
u無符號整型 integer
f浮點型
c復數(shù)浮點型
mtimedelta(時間間隔)
Mdatetime(日期時間)
O(Python) 對象
S, a(byte-)字符串
UUnicode
V原始數(shù)據(jù) (void)

NumPy 讀取數(shù)據(jù)

CSV:Comma-Separated Value,逗號分隔值文件

顯示:表格狀態(tài)

源文件:換行和逗號分隔行列的格式化文本,每一行的數(shù)據(jù)表示一條記錄

由于csv便于展示,讀取和寫入,所以很多地方也是用csv的格式存儲和傳輸中小型的數(shù)據(jù),為了方便教學,我們會經(jīng)常操作csv格式的文件,但是操作數(shù)據(jù)庫中的數(shù)據(jù)也是很容易的實現(xiàn)的

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False) 參數(shù)解釋
frame文件、字符串或產(chǎn)生器,可以是,gz或bz2壓縮文件
dtype數(shù)據(jù)類型,可選,CSV的字符串以什么數(shù)據(jù)類型讀入數(shù)據(jù),默認 np.float
delimiter分隔字符串,默認是任何空格,改為 逗號
skiprows跳過前x行,一般跳過第一行表頭
usecols讀取指定的列,索引,元組類型
unpack如果True,讀入屬性將分別寫入不同數(shù)組變量,Flase讀入數(shù)據(jù)只能寫入一個數(shù)組變量,默認Flase

NumPy 數(shù)組屬性

NumPy 數(shù)組的維數(shù)稱為秩(rank),秩就是軸的數(shù)量,即數(shù)組的維度,一維數(shù)組的秩為 1,二維數(shù)組的秩為 2,以此類推。

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

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

NumPy 的數(shù)組中比較重要 ndarray 對象屬性有:

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

ndarray.ndim

ndarray.ndim 用于返回數(shù)組的維數(shù),等于秩。

ndarray.shape

ndarray.shape 表示數(shù)組的維度,返回一個元組,這個元組的長度就是維度的數(shù)目,即 ndim 屬性(秩)。比如,一個二維數(shù)組,其維度表示"行數(shù)"和"列數(shù)"。

ndarray.shape 也可以用于調(diào)整數(shù)組大小。

NumPy 也提供了 reshape 函數(shù)來調(diào)整數(shù)組大小。

ndarray.itemsize

ndarray.itemsize 以字節(jié)的形式返回數(shù)組中每一個元素的大小。

例如,一個元素類型為 float64 的數(shù)組 itemsiz 屬性值為 8(float64 占用 64 個 bits,每個字節(jié)長度為 8,所以 64/8,占用 8 個字節(jié)),又如,一個元素類型為 complex32 的數(shù)組 item 屬性為 4(32/8)。

ndarray.flags

ndarray.flags 返回 ndarray 對象的內(nèi)存信息,包含以下屬性:

屬性描述
C_CONTIGUOUS ?數(shù)據(jù)是在一個單一的C風格的連續(xù)段中
F_CONTIGUOUS (F)數(shù)據(jù)是在一個單一的Fortran風格的連續(xù)段中
OWNDATA (O)數(shù)組擁有它所使用的內(nèi)存或從另一個對象中借用它
WRITEABLE (W)數(shù)據(jù)區(qū)域可以被寫入,將該值設(shè)置為 False,則數(shù)據(jù)為只讀
ALIGNED (A)數(shù)據(jù)和所有元素都適當?shù)貙R到硬件上
UPDATEIFCOPY (U)這個數(shù)組是其它數(shù)組的一個副本,當這個數(shù)組被釋放時,原數(shù)組的內(nèi)容將被更新

NumPy 創(chuàng)建數(shù)組

ndarray 數(shù)組除了可以使用底層 ndarray 構(gòu)造器來創(chuàng)建外,也可以通過以下幾種方式來創(chuàng)建。

numpy.empty

numpy.empty 方法用來創(chuàng)建一個指定形狀(shape)、數(shù)據(jù)類型(dtype)且未初始化的數(shù)組:

numpy.empty(shape, dtype = float, order = 'C')

參數(shù)說明:

參數(shù)描述
shape數(shù)組形狀
dtype數(shù)據(jù)類型,可選
order有"C"和"F"兩個選項,分別代表,行優(yōu)先和列優(yōu)先,在計算機內(nèi)存中的存儲元素的順序。

注意 ? 數(shù)組元素為隨機值,因為它們未初始化。

numpy.zeros

創(chuàng)建指定大小的數(shù)組,數(shù)組元素以 0 來填充:

numpy.zeros(shape, dtype = float, order = 'C')

參數(shù)說明:

參數(shù)描述
shape數(shù)組形狀
dtype數(shù)據(jù)類型,可選
order‘C’ 用于 C 的行數(shù)組,或者 ‘F’ 用于 FORTRAN 的列數(shù)組

numpy.ones

創(chuàng)建指定形狀的數(shù)組,數(shù)組元素以 1 來填充:

numpy.ones(shape, dtype = None, order = 'C')

參數(shù)說明:

參數(shù)描述
shape數(shù)組形狀
dtype數(shù)據(jù)類型,可選
order‘C’ 用于 C 的行數(shù)組,或者 ‘F’ 用于 FORTRAN 的列數(shù)組

NumPy 從已有的數(shù)組創(chuàng)建數(shù)組

numpy.asarray

numpy.asarray 類似 numpy.array,但 numpy.asarray 參數(shù)只有三個,比 numpy.array 少兩個。

numpy.asarray(a, dtype = None, order = None)

參數(shù)說明:

參數(shù)描述
a任意形式的輸入?yún)?shù),可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維數(shù)組
dtype數(shù)據(jù)類型,可選
order可選,有"C"和"F"兩個選項,分別代表,行優(yōu)先和列優(yōu)先,在計算機內(nèi)存中的存儲元素的順序。

numpy.frombuffer

numpy.frombuffer 用于實現(xiàn)動態(tài)數(shù)組。

numpy.frombuffer 接受 buffer 輸入?yún)?shù),以流的形式讀入轉(zhuǎn)化成 ndarray 對象。

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注意:buffer 是字符串的時候,Python3 默認 str 是 Unicode 類型,所以要轉(zhuǎn)成 bytestring 在原 str 前加上 b。

參數(shù)說明:

參數(shù)描述
buffer可以是任意對象,會以流的形式讀入。
dtype返回數(shù)組的數(shù)據(jù)類型,可選
count讀取的數(shù)據(jù)數(shù)量,默認為-1,讀取所有數(shù)據(jù)。
offset讀取的起始位置,默認為0。

numpy.fromiter

numpy.fromiter 方法從可迭代對象中建立 ndarray 對象,返回一維數(shù)組。

numpy.fromiter(iterable, dtype, count=-1) 參數(shù)描述
iterable可迭代對象
dtype返回數(shù)組的數(shù)據(jù)類型
count讀取的數(shù)據(jù)數(shù)量,默認為-1,讀取所有數(shù)據(jù)

NumPy 從數(shù)值范圍創(chuàng)建數(shù)組

numpy.arange

numpy 包中的使用 arange 函數(shù)創(chuàng)建數(shù)值范圍并返回 ndarray 對象,函數(shù)格式如下:

numpy.arange(start, stop, step, dtype)

根據(jù) start 與 stop 指定的范圍以及 step 設(shè)定的步長,生成一個 ndarray。

參數(shù)說明:

參數(shù)描述
start起始值,默認為0
stop終止值(不包含)
step步長,默認為1
dtype返回ndarray的數(shù)據(jù)類型,如果沒有提供,則會使用輸入數(shù)據(jù)的類型。

numpy.linspace

numpy.linspace 函數(shù)用于創(chuàng)建一個一維數(shù)組,數(shù)組是一個等差數(shù)列構(gòu)成的,格式如下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

參數(shù)說明:

參數(shù)描述
start序列的起始值
stop序列的終止值,如果endpoint為true,該值包含于數(shù)列中
num要生成的等步長的樣本數(shù)量,默認為50
endpoint該值為 true 時,數(shù)列中中包含stop值,反之不包含,默認是True。
retstep如果為 True 時,生成的數(shù)組中會顯示間距,反之不顯示。
dtypendarray 的數(shù)據(jù)類型

numpy.logspace

numpy.logspace 函數(shù)用于創(chuàng)建一個于等比數(shù)列。格式如下:

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

base 參數(shù)意思是取對數(shù)的時候 log 的下標。

參數(shù)描述
start序列的起始值為:base ** start
stop序列的終止值為:base ** stop。如果endpoint為true,該值包含于數(shù)列中
num要生成的等步長的樣本數(shù)量,默認為50
endpoint該值為 true 時,數(shù)列中中包含stop值,反之不包含,默認是True。
base對數(shù) log 的底數(shù)。
dtypendarray 的數(shù)據(jù)類型

NumPy 切片和索引

ndarray對象的內(nèi)容可以通過索引或切片來訪問和修改,與 Python 中 list 的切片操作一樣。

ndarray 數(shù)組可以基于 0 - n 的下標進行索引,切片對象可以通過內(nèi)置的 slice 函數(shù),并設(shè)置 start, stop 及 step 參數(shù)進行,從原數(shù)組中切割出一個新數(shù)組。通過冒號分隔切片參數(shù) start:stop:step 來進行切片操作。

冒號 : 的解釋:如果只放置一個參數(shù),如 [2],將返回與該索引相對應的單個元素。如果為 [2:],表示從該索引開始以后的所有項都將被提取。如果使用了兩個參數(shù),如 [2:7],那么則提取兩個索引(不包括停止索引)之間的項。

切片還可以包括省略號 ,來使選擇元組的長度與數(shù)組的維度相同。 如果在行位置使用省略號,它將返回包含行中元素的 ndarray。

NumPy 高級索引

NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整數(shù)和切片的索引外,數(shù)組可以由整數(shù)數(shù)組索引布爾索引花式索引

布爾索引

我們可以通過一個布爾數(shù)組來索引目標數(shù)組。

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

~(取補運算符)來過濾 NaN

花式索引

花式索引指的是利用整數(shù)數(shù)組進行索引。

花式索引根據(jù)索引數(shù)組的值作為目標數(shù)組的某個軸的下標來取值。對于使用一維整型數(shù)組作為索引,如果目標是一維數(shù)組,那么索引的結(jié)果就是對應位置的元素;如果目標是二維數(shù)組,那么就是對應下標的行。

花式索引跟切片不一樣,它總是將數(shù)據(jù)復制到新數(shù)組中。

  • 傳入順序索引數(shù)組

    實例

    import numpy as npx=np.arange(32).reshape((8,4)) print (x[[4,2,1,7]])

    輸出結(jié)果為:

    [[16 17 18 19][ 8 9 10 11][ 4 5 6 7][28 29 30 31]]
  • 傳入倒序索引數(shù)組

    實例

    import numpy as npx=np.arange(32).reshape((8,4)) print (x[[-4,-2,-1,-7]])

    輸出結(jié)果為:

    [[16 17 18 19][24 25 26 27][28 29 30 31][ 4 5 6 7]]
  • 傳入多個索引數(shù)組(要使用np.ix_)

    實例

    import numpy as npx=np.arange(32).reshape((8,4)) print (x[np.ix_([1,5,7,2],[0,3,1,2])])

    輸出結(jié)果為:

    [[ 4 7 5 6][20 23 21 22][28 31 29 30][ 8 11 9 10]]
  • NumPy 廣播(Broadcast)

    廣播(Broadcast)是 numpy 對不同形狀(shape)的數(shù)組進行數(shù)值計算的方式, 對數(shù)組的算術(shù)運算通常在相應的元素上進行。

    如果兩個數(shù)組 a 和 b 形狀相同,即滿足 a.shape == b.shape,那么 a*b 的結(jié)果就是 a 與 b 數(shù)組對應位相乘。這要求維數(shù)相同,且各維度的長度相同。

    當運算中的 2 個數(shù)組的形狀不同時,numpy 將自動觸發(fā)廣播機制。如:

    實例

    import numpy as npa = np.array([[ 0, 0, 0],[10,10,10],[20,20,20],[30,30,30]]) b = np.array([1,2,3]) print(a + b)

    輸出結(jié)果為:

    [[ 1 2 3][11 12 13][21 22 23][31 32 33]]

    下面的圖片展示了數(shù)組 b 如何通過廣播來與數(shù)組 a 兼容。

    4x3 的二維數(shù)組與長為 3 的一維數(shù)組相加,等效于把數(shù)組 b 在二維上重復 4 次再運算

    廣播的規(guī)則:

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

    **簡單理解:**對兩個數(shù)組,分別比較他們的每一個維度(若其中一個數(shù)組沒有當前維度則忽略),滿足:

    • 數(shù)組擁有相同形狀。
    • 當前維度的值相等。
    • 當前維度的值有一個是 1。

    若條件不滿足,拋出 “ValueError: frames are not aligned” 異常。

    NumPy 迭代數(shù)組

    NumPy 迭代器對象 numpy.nditer 提供了一種靈活訪問一個或者多個數(shù)組元素的方式。

    迭代器最基本的任務(wù)的可以完成對數(shù)組元素的訪問。

    控制遍歷順序

    • for x in np.nditer(a, order='F'):Fortran order,即是列序優(yōu)先;
    • for x in np.nditer(a.T, order='C'):C order,即是行序優(yōu)先;

    可以通過顯式設(shè)置,來強制 nditer 對象使用某種順序。

    修改數(shù)組中元素的值

    nditer 對象有另一個可選參數(shù) op_flags。 默認情況下,nditer 將視待迭代遍歷的數(shù)組為只讀對象(read-only),為了在遍歷數(shù)組的同時,實現(xiàn)對數(shù)組元素值得修改,必須指定 read-write 或者 write-only 的模式。

    使用外部循環(huán)

    nditer類的構(gòu)造器擁有flags參數(shù),它可以接受下列值:

    參數(shù)描述
    c_index可以跟蹤 C 順序的索引
    f_index可以跟蹤 Fortran 順序的索引
    multi-index每次迭代可以跟蹤一種索引類型
    external_loop給出的值是具有多個值的一維數(shù)組,而不是零維數(shù)組

    廣播迭代

    如果兩個數(shù)組是可廣播的,nditer 組合對象能夠同時迭代它們。 假設(shè)數(shù)組 a 的維度為 3X4,數(shù)組 b 的維度為 1X4 ,則使用以下迭代器(數(shù)組 b 被廣播到 a 的大小)。

    Numpy 數(shù)組操作

    Numpy 中包含了一些函數(shù)用于處理數(shù)組,大概可分為以下幾類:

    • 修改數(shù)組形狀
    • 翻轉(zhuǎn)數(shù)組
    • 修改數(shù)組維度
    • 連接數(shù)組
    • 分割數(shù)組
    • 數(shù)組元素的添加與刪除

    修改數(shù)組形狀

    函數(shù)描述
    reshape不改變數(shù)據(jù)的條件下修改形狀
    flat數(shù)組元素迭代器
    flatten返回一份數(shù)組拷貝,對拷貝所做的修改不會影響原始數(shù)組
    ravel返回展開數(shù)組

    numpy.reshape

    numpy.reshape 函數(shù)可以在不改變數(shù)據(jù)的條件下修改形狀,格式如下: numpy.reshape(arr, newshape, order=‘C’)

    • arr:要修改形狀的數(shù)組
    • newshape:整數(shù)或者整數(shù)數(shù)組,新的形狀應當兼容原有形狀
    • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘k’ – 元素在內(nèi)存中的出現(xiàn)順序。

    numpy.ndarray.flat

    numpy.ndarray.flat 是一個數(shù)組元素迭代器。

    numpy.ndarray.flatten

    numpy.ndarray.flatten 返回一份數(shù)組拷貝,對拷貝所做的修改不會影響原始數(shù)組,格式如下:

    ndarray.flatten(order='C')

    參數(shù)說明:

    • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘K’ – 元素在內(nèi)存中的出現(xiàn)順序。

    numpy.ravel

    numpy.ravel() 展平的數(shù)組元素,順序通常是"C風格",返回的是數(shù)組視圖(view,有點類似 C/C++引用reference的意味),修改會影響原始數(shù)組。

    該函數(shù)接收兩個參數(shù):

    numpy.ravel(a, order='C')

    參數(shù)說明:

    • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘K’ – 元素在內(nèi)存中的出現(xiàn)順序。

    翻轉(zhuǎn)數(shù)組

    函數(shù)描述
    transpose對換數(shù)組的維度
    ndarray.T和 self.transpose() 相同
    rollaxis向后滾動指定的軸
    swapaxes對換數(shù)組的兩個軸

    numpy.transpose

    numpy.transpose 函數(shù)用于對換數(shù)組的維度,格式如下:

    numpy.transpose(arr, axes)

    參數(shù)說明:

    • arr:要操作的數(shù)組
    • axes:整數(shù)列表,對應維度,通常所有維度都會對換。

    numpy.rollaxis

    numpy.rollaxis 函數(shù)向后滾動特定的軸到一個特定位置,格式如下:

    numpy.rollaxis(arr, axis, start)

    參數(shù)說明:

    • arr:數(shù)組
    • axis:要向后滾動的軸,其它軸的相對位置不會改變
    • start:默認為零,表示完整的滾動。會滾動到特定位置。

    numpy.swapaxes

    numpy.swapaxes 函數(shù)用于交換數(shù)組的兩個軸,格式如下:

    numpy.swapaxes(arr, axis1, axis2)
    • arr:輸入的數(shù)組
    • axis1:對應第一個軸的整數(shù)
    • axis2:對應第二個軸的整數(shù)

    修改數(shù)組維度

    維度描述
    broadcast產(chǎn)生模仿廣播的對象
    broadcast_to將數(shù)組廣播到新形狀
    expand_dims擴展數(shù)組的形狀
    squeeze從數(shù)組的形狀中刪除一維條目

    numpy.broadcast

    numpy.broadcast 用于模仿廣播的對象,它返回一個對象,該對象封裝了將一個數(shù)組廣播到另一個數(shù)組的結(jié)果。

    numpy.broadcast_to

    numpy.broadcast_to 函數(shù)將數(shù)組廣播到新形狀。它在原始數(shù)組上返回只讀視圖。 它通常不連續(xù)。 如果新形狀不符合 NumPy 的廣播規(guī)則,該函數(shù)可能會拋出ValueError。

    numpy.broadcast_to(array, shape, subok)

    numpy.expand_dims

    numpy.expand_dims 函數(shù)通過在指定位置插入新的軸來擴展數(shù)組形狀,函數(shù)格式如下:

    numpy.expand_dims(arr, axis)

    參數(shù)說明:

    • arr:輸入數(shù)組
    • axis:新軸插入的位置

    numpy.squeeze

    numpy.squeeze 函數(shù)從給定數(shù)組的形狀中刪除一維的條目,函數(shù)格式如下:

    numpy.squeeze(arr, axis)

    參數(shù)說明:

    • arr:輸入數(shù)組
    • axis:整數(shù)或整數(shù)元組,用于選擇形狀中一維條目的子集

    連接數(shù)組

    函數(shù)描述
    concatenate連接沿現(xiàn)有軸的數(shù)組序列
    stack沿著新的軸加入一系列數(shù)組。
    hstack水平堆疊序列中的數(shù)組(列方向)
    vstack豎直堆疊序列中的數(shù)組(行方向)

    numpy.concatenate

    numpy.concatenate 函數(shù)用于沿指定軸連接相同形狀的兩個或多個數(shù)組,格式如下:

    numpy.concatenate((a1, a2, ...), axis)

    參數(shù)說明:

    • a1, a2, ...:相同類型的數(shù)組
    • axis:沿著它連接數(shù)組的軸,默認為 0

    numpy.stack

    numpy.stack 函數(shù)用于沿新軸連接數(shù)組序列,格式如下:

    numpy.stack(arrays, axis)

    參數(shù)說明:

    • arrays相同形狀的數(shù)組序列
    • axis:返回數(shù)組中的軸,輸入數(shù)組沿著它來堆疊

    numpy.hstack

    numpy.hstack 是 numpy.stack 函數(shù)的變體,它通過水平堆疊來生成數(shù)組。

    numpy.vstack

    numpy.vstack 是 numpy.stack 函數(shù)的變體,它通過垂直堆疊來生成數(shù)組。

    分割數(shù)組

    函數(shù)數(shù)組及操作
    split將一個數(shù)組分割為多個子數(shù)組
    hsplit將一個數(shù)組水平分割為多個子數(shù)組(按列)
    vsplit將一個數(shù)組垂直分割為多個子數(shù)組(按行)

    numpy.split

    numpy.split 函數(shù)沿特定的軸將數(shù)組分割為子數(shù)組,格式如下:

    numpy.split(ary, indices_or_sections, axis)

    參數(shù)說明:

    • ary:被分割的數(shù)組
    • indices_or_sections:果是一個整數(shù),就用該數(shù)平均切分,如果是一個數(shù)組,為沿軸切分的位置(左開右閉)
    • axis:沿著哪個維度進行切向,默認為0,橫向切分。為1時,縱向切分

    numpy.hsplit

    numpy.hsplit 函數(shù)用于水平分割數(shù)組,通過指定要返回的相同形狀的數(shù)組數(shù)量來拆分原數(shù)組。

    numpy.vsplit

    numpy.vsplit 沿著垂直軸分割,其分割方式與hsplit用法相同。

    數(shù)組元素的添加與刪除

    函數(shù)元素及描述
    resize返回指定形狀的新數(shù)組
    append將值添加到數(shù)組末尾
    insert沿指定軸將值插入到指定下標之前
    delete刪掉某個軸的子數(shù)組,并返回刪除后的新數(shù)組
    unique查找數(shù)組內(nèi)的唯一元素

    numpy.resize

    numpy.resize 函數(shù)返回指定大小的新數(shù)組。

    如果新數(shù)組大小大于原始大小,則包含原始數(shù)組中的元素的副本。

    numpy.resize(arr, shape)

    參數(shù)說明:

    • arr:要修改大小的數(shù)組
    • shape:返回數(shù)組的新形狀

    numpy.append

    numpy.append 函數(shù)在數(shù)組的末尾添加值。 追加操作會分配整個數(shù)組,并把原來的數(shù)組復制到新數(shù)組中。 此外,輸入數(shù)組的維度必須匹配否則將生成ValueError。

    append 函數(shù)返回的始終是一個一維數(shù)組。

    numpy.append(arr, values, axis=None)

    參數(shù)說明:

    • arr:輸入數(shù)組
    • values:要向arr添加的值,需要和arr形狀相同(除了要添加的軸)
    • axis:默認為 None。當axis無定義時,是橫向加成,返回總是為一維數(shù)組!當axis有定義的時候,分別為0和1的時候。當axis有定義的時候,分別為0和1的時候(列數(shù)要相同)。當axis為1時,數(shù)組是加在右邊(行數(shù)要相同)。

    numpy.insert

    numpy.insert 函數(shù)在給定索引之前,沿給定軸在輸入數(shù)組中插入值。

    如果值的類型轉(zhuǎn)換為要插入,則它與輸入數(shù)組不同。 插入沒有原地的,函數(shù)會返回一個新數(shù)組。 此外,如果未提供軸,則輸入數(shù)組會被展開。

    numpy.insert(arr, obj, values, axis)

    參數(shù)說明:

    • arr:輸入數(shù)組
    • obj:在其之前插入值的索引
    • values:要插入的值
    • axis:沿著它插入的軸,如果未提供,則輸入數(shù)組會被展開

    numpy.delete

    numpy.delete 函數(shù)返回從輸入數(shù)組中刪除指定子數(shù)組的新數(shù)組。 與 insert() 函數(shù)的情況一樣,如果未提供軸參數(shù),則輸入數(shù)組將展開。

    Numpy.delete(arr, obj, axis)

    參數(shù)說明:

    • arr:輸入數(shù)組
    • obj:可以被切片,整數(shù)或者整數(shù)數(shù)組,表明要從輸入數(shù)組刪除的子數(shù)組
    • axis:沿著它刪除給定子數(shù)組的軸,如果未提供,則輸入數(shù)組會被展開

    numpy.unique

    numpy.unique 函數(shù)用于去除數(shù)組中的重復元素。

    numpy.unique(arr, return_index, return_inverse, return_counts)
    • arr:輸入數(shù)組,如果不是一維數(shù)組則會展開
    • return_index:如果為true,返回新列表元素在舊列表中的位置(下標),并以列表形式儲
    • return_inverse:如果為true,返回舊列表元素在新列表中的位置(下標),并以列表形式儲
    • return_counts:如果為true,返回去重數(shù)組中的元素在原數(shù)組中的出現(xiàn)次數(shù)

    NumPy 位運算

    NumPy “bitwise_” 開頭的函數(shù)是位運算函數(shù)。

    NumPy 位運算包括以下幾個函數(shù):

    函數(shù)描述
    bitwise_and對數(shù)組元素執(zhí)行位與操作
    bitwise_or對數(shù)組元素執(zhí)行位或操作
    invert按位取反
    left_shift向左移動二進制表示的位
    right_shift向右移動二進制表示的位

    **注:**也可以使用 “&”、 “~”、 “|” 和 “^” 等操作符進行計算。

    bitwise_and

    bitwise_and() 函數(shù)對數(shù)組中整數(shù)的二進制形式執(zhí)行位與運算。

    位與操作運算規(guī)律如下:

    ABAND
    111
    100
    010
    000

    bitwise_or

    bitwise_or()函數(shù)對數(shù)組中整數(shù)的二進制形式執(zhí)行位或運算。

    位或操作運算規(guī)律如下:

    ABOR
    111
    101
    011
    000

    invert

    invert() 函數(shù)對數(shù)組中整數(shù)進行位取反運算,即 0 變成 1,1 變成 0。

    對于有符號整數(shù),取該二進制數(shù)的補碼,然后 +1。二進制數(shù),最高位為0表示正數(shù),最高位為 1 表示負數(shù)。

    看看 ~1 的計算步驟:

    • 1(這里叫:原碼)轉(zhuǎn)二進制 = 00000001

    • 按位取反 = 11111110

    • 發(fā)現(xiàn)符號位(即最高位)為1(表示負數(shù)),將除符號位之外的其他數(shù)字取反 = 10000001

    • 末位加1取其補碼 = 10000010

    • 轉(zhuǎn)換回十進制 = -2

    • 表達式二進制值(2 的補數(shù))十進制值
      500000000 00000000 00000000 00000105
      ~511111111 11111111 11111111 11111010-6

    left_shift

    left_shift() 函數(shù)將數(shù)組元素的二進制形式向左移動到指定位置,右側(cè)附加相等數(shù)量的 0。

    right_shift

    right_shift() 函數(shù)將數(shù)組元素的二進制形式向右移動到指定位置,左側(cè)附加相等數(shù)量的 0。

    NumPy 字符串函數(shù)

    以下函數(shù)用于對 dtype 為 numpy.string_ 或 numpy.unicode_ 的數(shù)組執(zhí)行向量化字符串操作。 它們基于 Python 內(nèi)置庫中的標準字符串函數(shù)。

    這些函數(shù)在字符數(shù)組類(numpy.char)中定義。

    函數(shù)描述
    add()對兩個數(shù)組的逐個字符串元素進行連接
    multiply()返回按元素多重連接后的字符串
    center()居中字符串
    capitalize()將字符串第一個字母轉(zhuǎn)換為大寫
    title()將字符串的每個單詞的第一個字母轉(zhuǎn)換為大寫
    lower()數(shù)組元素轉(zhuǎn)換為小寫
    upper()數(shù)組元素轉(zhuǎn)換為大寫
    split()指定分隔符對字符串進行分割,并返回數(shù)組列表
    splitlines()返回元素中的行列表,以換行符分割
    strip()移除元素開頭或者結(jié)尾處的特定字符
    join()通過指定分隔符來連接數(shù)組中的元素
    replace()使用新字符串替換字符串中的所有子字符串
    decode()數(shù)組元素依次調(diào)用str.decode
    encode()數(shù)組元素依次調(diào)用str.encode

    numpy.char.add()

    numpy.char.add() 函數(shù)依次對兩個數(shù)組的元素進行字符串連接。

    numpy.char.multiply()

    numpy.char.multiply() 函數(shù)執(zhí)行多重連接。

    numpy.char.center()

    numpy.char.center() 函數(shù)用于將字符串居中,并使用指定字符在左側(cè)和右側(cè)進行填充。

    numpy.char.capitalize()

    numpy.char.capitalize() 函數(shù)將字符串的第一個字母轉(zhuǎn)換為大寫。

    numpy.char.title()

    numpy.char.title() 函數(shù)將字符串的每個單詞的第一個字母轉(zhuǎn)換為大寫。

    numpy.char.lower()

    numpy.char.lower() 函數(shù)對數(shù)組的每個元素轉(zhuǎn)換為小寫。它對每個元素調(diào)用 str.lower。

    numpy.char.upper()

    numpy.char.upper() 函數(shù)對數(shù)組的每個元素轉(zhuǎn)換為大寫。它對每個元素調(diào)用 str.upper。

    numpy.char.split()

    numpy.char.split() 通過指定分隔符對字符串進行分割,并返回數(shù)組。默認情況下,分隔符為空格。

    numpy.char.splitlines()

    numpy.char.splitlines() 函數(shù)以換行符作為分隔符來分割字符串,并返回數(shù)組。

    \n,\r,\r\n 都可用作換行符。

    numpy.char.strip()

    numpy.char.strip() 函數(shù)用于移除開頭或結(jié)尾處的特定字符。

    numpy.char.join()

    numpy.char.join() 函數(shù)通過指定分隔符來連接數(shù)組中的元素或字符串。

    numpy.char.replace()

    numpy.char.replace() 函數(shù)使用新字符串替換字符串中的所有子字符串。

    numpy.char.encode()

    numpy.char.encode() 函數(shù)對數(shù)組中的每個元素調(diào)用 str.encode 函數(shù)。 默認編碼是 utf-8,可以使用標準 Python 庫中的編解碼器。

    numpy.char.decode()

    numpy.char.decode() 函數(shù)對編碼的元素進行 str.decode() 解碼。

    NumPy 數(shù)學函數(shù)

    NumPy 包含大量的各種數(shù)學運算的函數(shù),包括三角函數(shù),算術(shù)運算的函數(shù),復數(shù)處理函數(shù)等。

    三角函數(shù)

    NumPy 提供了標準的三角函數(shù):sin()、cos()、tan()。

    arcsin,arccos,和 arctan 函數(shù)返回給定角度的 sin,cos 和 tan 的反三角函數(shù)。

    這些函數(shù)的結(jié)果可以通過 numpy.degrees() 函數(shù)將弧度轉(zhuǎn)換為角度。

    舍入函數(shù)

    numpy.around() 函數(shù)返回指定數(shù)字的四舍五入值。

    numpy.around(a,decimals)

    參數(shù)說明:

    • a: 數(shù)組
    • decimals: 舍入的小數(shù)位數(shù)。 默認值為0。 如果為負,整數(shù)將四舍五入到小數(shù)點左側(cè)的位置

    numpy.floor()

    numpy.floor() 返回小于或者等于指定表達式的最大整數(shù),即向下取整。

    numpy.ceil()

    numpy.ceil() 返回大于或者等于指定表達式的最小整數(shù),即向上取整。

    NumPy 算術(shù)函數(shù)

    NumPy 算術(shù)函數(shù)包含簡單的加減乘除: add()subtract()multiply()divide()

    需要注意的是數(shù)組必須具有相同的形狀或符合數(shù)組廣播規(guī)則。

    此外 Numpy 也包含了其他重要的算術(shù)函數(shù)。

    numpy.reciprocal()

    numpy.reciprocal() 函數(shù)返回參數(shù)逐元素的倒數(shù)。如 1/4 倒數(shù)為 4/1

    numpy.power()

    numpy.power() 函數(shù)將第一個輸入數(shù)組中的元素作為底數(shù),計算它與第二個輸入數(shù)組中相應元素的冪。

    numpy.mod()

    numpy.mod() 計算輸入數(shù)組中相應元素的相除后的余數(shù)。 函數(shù) numpy.remainder() 也產(chǎn)生相同的結(jié)果。

    NumPy 統(tǒng)計函數(shù)

    NumPy 提供了很多統(tǒng)計函數(shù),用于從數(shù)組中查找最小元素,最大元素,百分位標準差和方差等。 函數(shù)說明如下:

    numpy.amin() 和 numpy.amax()

    numpy.amin() 用于計算數(shù)組中的元素沿指定軸的最小值。

    numpy.amax() 用于計算數(shù)組中的元素沿指定軸的最大值。

    numpy.ptp()

    numpy.ptp()函數(shù)計算數(shù)組中元素最大值與最小值的差(最大值 - 最小值)。

    numpy.percentile()

    百分位數(shù)是統(tǒng)計中使用的度量,表示小于這個值的觀察值的百分比。 函數(shù)numpy.percentile()接受以下參數(shù)。

    numpy.percentile(a, q, axis)

    參數(shù)說明:

    • a: 輸入數(shù)組
    • q: 要計算的百分位數(shù),在 0 ~ 100 之間
    • axis: 沿著它計算百分位數(shù)的軸

    首先明確百分位數(shù):

    第 p 個百分位數(shù)是這樣一個值,它使得至少有 p% 的數(shù)據(jù)項小于或等于這個值,且至少有 (100-p)% 的數(shù)據(jù)項大于或等于這個值。

    舉個例子:高等院校的入學考試成績經(jīng)常以百分位數(shù)的形式報告。比如,假設(shè)某個考生在入學考試中的語文部分的原始分數(shù)為 54 分。相對于參加同一考試的其他學生來說,他的成績?nèi)绾尾⒉蝗菀字馈5侨绻挤謹?shù)54分恰好對應的是第70百分位數(shù),我們就能知道大約70%的學生的考分比他低,而約30%的學生考分比他高。這里的 p = 70。

    numpy.median()

    numpy.median() 函數(shù)用于計算數(shù)組 a 中元素的中位數(shù)(中值)

    numpy.mean()

    numpy.mean() 函數(shù)返回數(shù)組中元素的算術(shù)平均值。 如果提供了軸,則沿其計算。

    算術(shù)平均值是沿軸的元素的總和除以元素的數(shù)量。

    numpy.average()

    numpy.average() 函數(shù)根據(jù)在另一個數(shù)組中給出的各自的權(quán)重計算數(shù)組中元素的加權(quán)平均值。

    該函數(shù)可以接受一個軸參數(shù)。 如果沒有指定軸,則數(shù)組會被展開。

    加權(quán)平均值即將各數(shù)值乘以相應的權(quán)數(shù),然后加總求和得到總體值,再除以總的單位數(shù)。

    考慮數(shù)組[1,2,3,4]和相應的權(quán)重[4,3,2,1],通過將相應元素的乘積相加,并將和除以權(quán)重的和,來計算加權(quán)平均值。

    加權(quán)平均值 = (1*4+2*3+3*2+4*1)/(4+3+2+1)

    標準差

    標準差是一組數(shù)據(jù)平均值分散程度的一種度量。

    標準差是方差的算術(shù)平方根。

    標準差公式如下:

    std = sqrt(mean((x - x.mean())**2))

    如果數(shù)組是 [1,2,3,4],則其平均值為 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,結(jié)果為 1.1180339887498949。

    方差

    統(tǒng)計中的方差(樣本方差)是每個樣本值與全體樣本值的平均數(shù)之差的平方值的平均數(shù),即 mean((x - x.mean())** 2)。

    換句話說,標準差是方差的平方根。

    NumPy 排序、條件刷選函數(shù)

    NumPy 提供了多種排序的方法。 這些排序函數(shù)實現(xiàn)不同的排序算法,每個排序算法的特征在于執(zhí)行速度,最壞情況性能,所需的工作空間和算法的穩(wěn)定性。 下表顯示了三種排序算法的比較。

    種類速度最壞情況工作空間穩(wěn)定性
    'quicksort'(快速排序)1O(n^2)0
    'mergesort'(歸并排序)2O(n*log(n))~n/2
    'heapsort'(堆排序)3O(n*log(n))0

    numpy.sort()

    numpy.sort() 函數(shù)返回輸入數(shù)組的排序副本。函數(shù)格式如下:

    numpy.sort(a, axis, kind, order)

    參數(shù)說明:

    • a: 要排序的數(shù)組
    • axis: 沿著它排序數(shù)組的軸,如果沒有數(shù)組會被展開,沿著最后的軸排序, axis=0 按列排序,axis=1 按行排序
    • kind: 默認為’quicksort’(快速排序)
    • order: 如果數(shù)組包含字段,則是要排序的字段

    numpy.argsort()

    numpy.argsort() 函數(shù)返回的是數(shù)組值從小到大的索引值。

    numpy.lexsort()

    numpy.lexsort() 用于對多個序列進行排序。把它想象成對電子表格進行排序,每一列代表一個序列,排序時優(yōu)先照顧靠后的列。

    這里舉一個應用場景:小升初考試,重點班錄取學生按照總成績錄取。在總成績相同時,數(shù)學成績高的優(yōu)先錄取,在總成績和數(shù)學成績都相同時,按照英語成績錄取…… 這里,總成績排在電子表格的最后一列,數(shù)學成績在倒數(shù)第二列,英語成績在倒數(shù)第三列。

    msort、sort_complex、partition、argpartition

    函數(shù)描述
    msort(a)數(shù)組按第一個軸排序,返回排序后的數(shù)組副本。np.msort(a) 相等于 np.sort(a, axis=0)。
    sort_complex(a)對復數(shù)按照先實部后虛部的順序進行排序。
    partition(a, kth[, axis, kind, order])指定一個數(shù),對數(shù)組進行分區(qū)
    argpartition(a, kth[, axis, kind, order])可以通過關(guān)鍵字 kind 指定算法沿著指定軸對數(shù)組進行分區(qū)

    numpy.argmax() 和 numpy.argmin()

    numpy.argmax() 和 numpy.argmin()函數(shù)分別沿給定軸返回最大和最小元素的索引。

    numpy.nonzero()

    numpy.nonzero() 函數(shù)返回輸入數(shù)組中非零元素的索引。

    numpy.where()

    numpy.where() 函數(shù)返回輸入數(shù)組中滿足給定條件的元素的索引。

    numpy.extract()

    numpy.extract() 函數(shù)根據(jù)某個條件從數(shù)組中抽取元素,返回滿條件的元素。

    NumPy 字節(jié)交換

    在幾乎所有的機器上,多字節(jié)對象都被存儲為連續(xù)的字節(jié)序列。字節(jié)順序,是跨越多字節(jié)的程序?qū)ο蟮拇鎯σ?guī)則。

    • **大端模式:**指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲模式有點兒類似于把數(shù)據(jù)當作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習慣一致。
    • **小端模式:**指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低。

    例如在 C 語言中,一個類型為 int 的變量 x 地址為 0x100,那么其對應地址表達式&x的值為 0x100。且x的四個字節(jié)將被存儲在存儲器的 0x100, 0x101, 0x102, 0x103位置。

    numpy.ndarray.byteswap()

    numpy.ndarray.byteswap() 函數(shù)將 ndarray 中每個元素中的字節(jié)進行大小端轉(zhuǎn)換。

    NumPy 副本和視圖

    副本是一個數(shù)據(jù)的完整的拷貝,如果我們對副本進行修改,它不會影響到原始數(shù)據(jù),物理內(nèi)存不在同一位置。

    視圖是數(shù)據(jù)的一個別稱或引用,通過該別稱或引用亦便可訪問、操作原有數(shù)據(jù),但原有數(shù)據(jù)不會產(chǎn)生拷貝。如果我們對視圖進行修改,它會影響到原始數(shù)據(jù),物理內(nèi)存在同一位置。

    視圖一般發(fā)生在:

    • 1、numpy 的切片操作返回原數(shù)據(jù)的視圖。
    • 2、調(diào)用 ndarray 的 view() 函數(shù)產(chǎn)生一個視圖。

    副本一般發(fā)生在:

    • Python 序列的切片操作,調(diào)用deepCopy()函數(shù)。
    • 調(diào)用 ndarray 的 copy() 函數(shù)產(chǎn)生一個副本。

    無復制

    簡單的賦值不會創(chuàng)建數(shù)組對象的副本。 相反,它使用原始數(shù)組的相同id()來訪問它。 id()返回 Python 對象的通用標識符,類似于 C 中的指針。

    此外,一個數(shù)組的任何變化都反映在另一個數(shù)組上。 例如,一個數(shù)組的形狀改變也會改變另一個數(shù)組的形狀。

    視圖或淺拷貝

    ndarray.view() 方會創(chuàng)建一個新的數(shù)組對象,該方法創(chuàng)建的新數(shù)組的維數(shù)更改不會更改原始數(shù)據(jù)的維數(shù)。使用切片創(chuàng)建視圖修改數(shù)據(jù)會影響到原始數(shù)組。

    副本或深拷貝

    ndarray.copy() 函數(shù)創(chuàng)建一個副本。 對副本數(shù)據(jù)進行修改,不會影響到原始數(shù)據(jù),它們物理內(nèi)存不在同一位置。

    Python append() 與深拷貝、淺拷貝

    深淺拷貝

    在 Python 中,對象賦值實際上是對象的引用。當創(chuàng)建一個對象,然后把它賦給另一個變量的時候,Python 并沒有拷貝這個對象,而只是拷貝了這個對象的引用,我們稱之為淺拷貝。

    在 Python 中,為了使當進行賦值操作時,兩個變量互補影響,可以使用 copy 模塊中的 deepcopy 方法,稱之為深拷貝。

    append() 函數(shù)

    當 list 類型的對象進行 append 操作時,實際上追加的是該對象的引用。

    id() 函數(shù):返回對象的唯一標識,可以類比成該對象在內(nèi)存中的地址。

    >>>alist = [] >>> num = [2] >>> alist.append( num ) >>> id( num ) == id( alist[0] ) True

    如上例所示,當 num 發(fā)生變化時(前提是 id(num) 不發(fā)生變化),alist 的內(nèi)容隨之會發(fā)生變化。往往會帶來意想不到的后果,想避免這種情況,可以采用深拷貝解決:

    alist.append( copy.deepcopy( num ) )

    PS:
    id()函數(shù):返回對象的唯一標識,可以類比成該對象在內(nèi)存中的地址。

    NumPy 矩陣庫(Matrix)

    NumPy 中包含了一個矩陣庫 numpy.matlib,該模塊中的函數(shù)返回的是一個矩陣,而不是 ndarray 對象。

    一個m×nm \times nm×n 的矩陣是一個由 $ m $ 行(row)列 $ n $(column)元素排列成的矩形陣列。

    矩陣里的元素可以是數(shù)字、符號或數(shù)學式。

    matlib.empty()

    matlib.empty() 函數(shù)返回一個新的矩陣,語法格式為:

    numpy.matlib.empty(shape, dtype, order)

    參數(shù)說明:

    • shape: 定義新矩陣形狀的整數(shù)或整數(shù)元組
    • Dtype: 可選,數(shù)據(jù)類型
    • order: C(行序優(yōu)先) 或者 F(列序優(yōu)先)

    numpy.matlib.zeros()

    numpy.matlib.zeros() 函數(shù)創(chuàng)建一個以 0 填充的矩陣。

    numpy.matlib.ones()

    numpy.matlib.ones()函數(shù)創(chuàng)建一個以 1 填充的矩陣。

    numpy.matlib.eye()

    numpy.matlib.eye() 函數(shù)返回一個矩陣,對角線元素為 1,其他位置為零。

    numpy.matlib.eye(n, M,k, dtype)

    參數(shù)說明:

    • n: 返回矩陣的行數(shù)
    • M: 返回矩陣的列數(shù),默認為 n
    • k: 對角線的索引
    • dtype: 數(shù)據(jù)類型

    numpy.matlib.identity()

    numpy.matlib.identity() 函數(shù)返回給定大小的單位矩陣。

    單位矩陣是個方陣,從左上角到右下角的對角線(稱為主對角線)上的元素均為 1,除此以外全都為 0。

    numpy.matlib.rand()

    numpy.matlib.rand() 函數(shù)創(chuàng)建一個給定大小的矩陣,數(shù)據(jù)是隨機填充的。

    NumPy 線性代數(shù)

    NumPy 提供了線性代數(shù)函數(shù)庫 linalg,該庫包含了線性代數(shù)所需的所有功能,可以看看下面的說明:

    函數(shù)描述
    dot兩個數(shù)組的點積,即元素對應相乘。
    vdot兩個向量的點積
    inner兩個數(shù)組的內(nèi)積
    matmul兩個數(shù)組的矩陣積
    determinant數(shù)組的行列式
    solve求解線性矩陣方程
    inv計算矩陣的乘法逆矩陣

    numpy.dot()

    numpy.dot() 對于兩個一維的數(shù)組,計算的是這兩個數(shù)組對應下標元素的乘積和(數(shù)學上稱之為內(nèi)積);對于二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積;對于多維數(shù)組,它的通用計算公式如下,即結(jié)果數(shù)組中的每個元素都是:數(shù)組a的最后一維上的所有元素與數(shù)組b的倒數(shù)第二位上的所有元素的乘積和: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

    numpy.dot(a, b, out=None)

    參數(shù)說明:

    • a : ndarray 數(shù)組
    • b : ndarray 數(shù)組
    • out : ndarray, 可選,用來保存dot()的計算結(jié)果

    numpy.vdot()

    numpy.vdot() 函數(shù)是兩個向量的點積。 如果第一個參數(shù)是復數(shù),那么它的共軛復數(shù)會用于計算。 如果參數(shù)是多維數(shù)組,它會被展開。

    numpy.inner()

    numpy.inner() 函數(shù)返回一維數(shù)組的向量內(nèi)積。對于更高的維度,它返回最后一個軸上的和的乘積。

    numpy.matmul

    numpy.matmul 函數(shù)返回兩個數(shù)組的矩陣乘積。 雖然它返回二維數(shù)組的正常乘積,但如果任一參數(shù)的維數(shù)大于2,則將其視為存在于最后兩個索引的矩陣的棧,并進行相應廣播。

    另一方面,如果任一參數(shù)是一維數(shù)組,則通過在其維度上附加 1 來將其提升為矩陣,并在乘法之后被去除。

    numpy.linalg.det()

    numpy.linalg.det() 函數(shù)計算輸入矩陣的行列式。

    行列式在線性代數(shù)中是非常有用的值。 它從方陣的對角元素計算。 對于 2×2 矩陣,它是左上和右下元素的乘積與其他兩個的乘積的差。

    換句話說,對于矩陣[[a,b],[c,d]],行列式計算為 ad-bc。 較大的方陣被認為是 2×2 矩陣的組合。

    numpy.linalg.solve()

    numpy.linalg.solve() 函數(shù)給出了矩陣形式的線性方程的解。

    考慮以下線性方程:

    x + y + z = 62y + 5z = -42x + 5y - z = 27

    可以使用矩陣表示為:

    如果矩陣成為A、X和B,方程變?yōu)?#xff1a;

    AX = B或X = A^(-1)B

    numpy.linalg.inv()

    numpy.linalg.inv() 函數(shù)計算矩陣的乘法逆矩陣。

    逆矩陣(inverse matrix):設(shè)A是數(shù)域上的一個n階矩陣,若在相同數(shù)域上存在另一個n階矩陣B,使得: AB=BA=E ,則我們稱B是A的逆矩陣,而A則被稱為可逆矩陣。注:E為單位矩陣。

    NumPy IO

    Numpy 可以讀寫磁盤上的文本數(shù)據(jù)或二進制數(shù)據(jù)。

    NumPy 為 ndarray 對象引入了一個簡單的文件格式:npy

    npy 文件用于存儲重建 ndarray 所需的數(shù)據(jù)、圖形、dtype 和其他信息。

    常用的 IO 函數(shù)有:

    • load() 和 save() 函數(shù)是讀寫文件數(shù)組數(shù)據(jù)的兩個主要函數(shù),默認情況下,數(shù)組是以未壓縮的原始二進制格式保存在擴展名為 .npy 的文件中。

    • savze() 函數(shù)用于將多個數(shù)組寫入文件,默認情況下,數(shù)組是以未壓縮的原始二進制格式保存在擴展名為 .npz 的文件中。

    • loadtxt() 和 savetxt() 函數(shù)處理正常的文本文件(.txt 等)

    numpy.save()

    numpy.save() 函數(shù)將數(shù)組保存到以 .npy 為擴展名的文件中。

    numpy.save(file, arr, allow_pickle=True, fix_imports=True)

    參數(shù)說明:

    • file:要保存的文件,擴展名為 .npy,如果文件路徑末尾沒有擴展名 .npy,該擴展名會被自動加上。
    • arr: 要保存的數(shù)組
    • allow_pickle: 可選,布爾值,允許使用 Python pickles 保存對象數(shù)組,Python 中的 pickle 用于在保存到磁盤文件或從磁盤文件讀取之前,對對象進行序列化和反序列化。
    • fix_imports: 可選,為了方便 Pyhton2 中讀取 Python3 保存的數(shù)據(jù)。

    .npy是 Numpy 專用的二進制格式后的數(shù)據(jù),可以使用 load() 函數(shù)來讀取數(shù)據(jù)就可以正常顯示。

    numpy.savez

    numpy.savez() 函數(shù)將多個數(shù)組保存到以 npz 為擴展名的文件中。

    numpy.savez(file, *args, **kwds)

    參數(shù)說明:

    • file:要保存的文件,擴展名為 .npz,如果文件路徑末尾沒有擴展名 .npz,該擴展名會被自動加上。
    • args: 要保存的數(shù)組,可以使用關(guān)鍵字參數(shù)為數(shù)組起一個名字,非關(guān)鍵字參數(shù)傳遞的數(shù)組會自動起名為 arr_0, arr_1, … 。
    • kwds: 要保存的數(shù)組使用關(guān)鍵字名稱。

    numpy.savetxt()

    savetxt() 函數(shù)是以簡單的文本文件格式存儲數(shù)據(jù),對應的使用 loadtxt() 函數(shù)來獲取數(shù)據(jù)。

    np.loadtxt(FILENAME, dtype=int, delimiter=' ') np.savetxt(FILENAME, a, fmt="%d", delimiter=",")

    參數(shù) delimiter 可以指定各種分隔符、針對特定列的轉(zhuǎn)換器函數(shù)、需要跳過的行數(shù)等。

    總結(jié)

    以上是生活随笔為你收集整理的NumPy 笔记(超级全!收藏√)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。