[TOC]
NumPy
numpy 是python語言的一個(gè)擴(kuò)展程序庫, 支持大量的維度數(shù)組與矩陣運(yùn)算, 此外也針對(duì)數(shù)組提供大量的數(shù)學(xué)函數(shù)庫.
numpy是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫, 主要用于數(shù)組計(jì)算, 包含:
一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarry
廣播功能函數(shù)
整合C/C++/Fortran代碼的工具
線性代數(shù), 傅里葉變換, 隨機(jī)數(shù)生成等功能
numpy應(yīng)用
numpy與scipy(Scientific Python)和 Matplotlib(繪圖庫)一起使用混蔼, 這種組合廣泛用于替代 MatLab零聚,是一個(gè)強(qiáng)大的科學(xué)計(jì)算環(huán)境咳短,有助于我們通過 Python 學(xué)習(xí)數(shù)據(jù)科學(xué)或者機(jī)器學(xué)習(xí)踩晶。
SciPy 是一個(gè)開源的 Python 算法庫和數(shù)學(xué)工具包勋乾。
SciPy 包含的模塊有最優(yōu)化宋下、線性代數(shù)、積分辑莫、插值学歧、特殊函數(shù)、快速傅里葉變換各吨、信號(hào)處理和圖像處理枝笨、常微分方程求解和其他科學(xué)與工程中常用的計(jì)算。
Matplotlib 是 Python 編程語言及其數(shù)值數(shù)學(xué)擴(kuò)展包 NumPy 的可視化操作界面揭蜒。它為利用通用的圖形用戶界面工具包伺帘,如 Tkinter, wxPython, Qt 或 GTK+ 向應(yīng)用程序嵌入式繪圖提供了應(yīng)用程序接口(API)。
numpy 安裝
使用已經(jīng)集成了這些模塊的開發(fā)工具如Anaconda, Enthought Canopy, Python(x,y), WinPython, Pyzo
-
使用pip來安裝
python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
--user 選項(xiàng)可以設(shè)置只安裝在當(dāng)前的用戶下, 而不是寫入到系統(tǒng)目錄
linux下安裝
ubuntu&debian
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
centos& Fedora
sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel
mac:
python -m pip install numpy scipy matplotlib
安裝驗(yàn)證
>>> from nummpy import *
>>> eye(4)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
eye(4)生成對(duì)角矩陣
numpy Ndarray 對(duì)象
NumPy 最重要的一個(gè)特點(diǎn)是其 N 維數(shù)組對(duì)象 ndarray忌锯,它是一系列同類型數(shù)據(jù)的集合伪嫁,以 0 下標(biāo)為開始進(jìn)行集合中元素的索引。
ndarray 對(duì)象是用于存放同類型元素的多維數(shù)組偶垮。
ndarray 中的每個(gè)元素在內(nèi)存中都有相同存儲(chǔ)大小的區(qū)域张咳。
ndarray 內(nèi)部由以下內(nèi)容組成:
1.一個(gè)指向數(shù)據(jù)(內(nèi)存或內(nèi)存映射文件中的一塊數(shù)據(jù))的指針
2.數(shù)據(jù)類型或dtype, 描述在數(shù)組中的固定大小值的格子
3.一個(gè)表示數(shù)組形狀(shape)的元組, 表示各維度大小的元組
4.一個(gè)跨度元組(stride), 其中的整數(shù)指的是為了前進(jìn)到當(dāng)前維度下一個(gè)元素需要"跨過"的字節(jié)數(shù).
ndarray內(nèi)部結(jié)構(gòu):
跨度可以是負(fù)數(shù), 這樣會(huì)使數(shù)組在內(nèi)存中向后移動(dòng), 切片中obj[::-1]
或obj[:,::-1]
就是如此.
創(chuàng)建一個(gè)ndarray只需要調(diào)用Numpy的array函數(shù)即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名稱 | 描述 |
---|---|
object | 數(shù)組或嵌套的數(shù)列 |
dtype | 數(shù)組元素的數(shù)據(jù)類型, 可選 |
copy | 對(duì)象是否需要復(fù)制, 可選 |
order | 創(chuàng)建數(shù)組的樣式, C為行方向, F為列方向, A為任意方向(默認(rèn)) |
subok | 默認(rèn)返回一個(gè)與基類類型一致的數(shù)組 |
ndmin | 指生成數(shù)的最小維度 |
實(shí)例
import numpy
a = numpy.array([1,2,3])
print (a)
輸出:
[1 2 3]
實(shí)例2:
# 多于一個(gè)維度, 兩個(gè)數(shù)組
import numpy
a = numpy.array([[1,2,3], [4,5]])
print (a)
[[1, 2, 3] [4, 5]]
[Finished in 0.1s]
實(shí)例3:
# 最小維度
import numpy
a = numpy.array([1,2,3,4,5],ndmin = 2)
print (a)
輸出:
[[1 2 3 4 5]]
[Finished in 0.1s]
實(shí)例4:
# dtype 參數(shù)
import numpy
a = numpy.array([1,2,3,4,5], dtype = complex)
print (a)
輸出:
[ 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j]
[Finished in 0.1s]
ndarray對(duì)象由計(jì)算機(jī)內(nèi)存的連續(xù)一維部分組成, 并結(jié)合索引模式, 將每個(gè)元素映射到內(nèi)存塊中的一個(gè)位置. 內(nèi)存塊一行順序(C樣式)或列順序(FORTRAN或Matlab風(fēng)格, 即F樣式)來保存元素
numpy數(shù)據(jù)類型
numpy支持的數(shù)據(jù)類型比python內(nèi)置的類型要多很多, 基本上可以和C語言的數(shù)據(jù)類型對(duì)應(yīng)上, 其中部分類型對(duì)應(yīng)為Python內(nèi)置的類型.
常用基本類型:
名稱 | 描述 |
---|---|
bool_ | 布爾型數(shù)據(jù)類型(True 或者 False) |
int_ | 默認(rèn)的整數(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 | 無符號(hào)整數(shù)(0 to 255) |
uint16 | 無符號(hào)整數(shù)(0 to 65535) |
uint32 | 無符號(hào)整數(shù)(0 to 4294967295) |
uint64 | 無符號(hào)整數(shù)(0 to 18446744073709551615) |
float_ | float64 類型的簡(jiǎn)寫 |
float16 | 半精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位砚哗,5 個(gè)指數(shù)位龙助,10 個(gè)尾數(shù)位 |
float32 | 單精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位蛛芥,8 個(gè)指數(shù)位提鸟,23 個(gè)尾數(shù)位 |
float64 | 雙精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位仅淑,11 個(gè)指數(shù)位称勋,52 個(gè)尾數(shù)位 |
complex_ | complex128 類型的簡(jiǎn)寫,即 128 位復(fù)數(shù) |
complex64 | 復(fù)數(shù)涯竟,表示雙 32 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
complex128 | 復(fù)數(shù)赡鲜,表示雙 64 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
numpy的數(shù)值類型實(shí)際上是dtype對(duì)象的實(shí)例, 并對(duì)應(yīng)唯一的字符, 包括np.bool_. np.int32, np.float32 , 等等
數(shù)據(jù)類型對(duì)象(dtype)
數(shù)據(jù)類型對(duì)象是用來描述與數(shù)組對(duì)應(yīng)的內(nèi)存區(qū)域如何使用, 這依賴如下幾個(gè)方面:
- 數(shù)據(jù)類型(整數(shù), 浮點(diǎn)數(shù)或者python對(duì)象)
- 數(shù)據(jù)的大小(列如, 整數(shù)使用多少個(gè)字節(jié)存儲(chǔ))
- 數(shù)據(jù)的字節(jié)順序(小端法或大端法)
- 在結(jié)構(gòu)化類型的情況下, 字段的名稱, 每個(gè)字段的數(shù)據(jù)類型和每個(gè)字段所取的內(nèi)存塊的部分
- 如果數(shù)據(jù) 類型是子數(shù)組, 他的形狀和數(shù)據(jù)類型
字節(jié)順序是通過對(duì)數(shù)據(jù)類型預(yù)先設(shè)定"<"或">"來決定的. "<"意味著小端法(最小值存儲(chǔ)在最小的地址, 即低位組放在最前面). ">"意味著大端法(最重要的字節(jié)存儲(chǔ)在最小的地址, 即高位組放在最前面).
dtype對(duì)象是使用以下語法構(gòu)造的:
numpy.dtype(object, align, copy)
object
: 要轉(zhuǎn)換為的數(shù)據(jù)類型對(duì)象
align:
如果為true, 填充字段使其類似C的結(jié)構(gòu)體
copy:
復(fù)制dtype對(duì)象, 如果為false, 則是對(duì)內(nèi)置數(shù)據(jù)類型對(duì)象的引用
實(shí)例
import numpy
# 使用標(biāo)量類型
a = numpy.dtype(numpy.int32)
print (a)
輸出:
int32
[Finished in 0.1s]
實(shí)例2:
# int8, int16, int32, int64 四種數(shù)據(jù)類型可以使用字符串 'i1', 'i2','i4','i8' 代替
import numpy
a = numpy.dtype('i4')
print (a)
輸出:
int32
[Finished in 0.1s]
實(shí)例3:
import numpy
# 字節(jié)順序標(biāo)注
a = numpy.dtype('<i4')
print (a)
輸出:
int32
結(jié)構(gòu)化數(shù)據(jù)類型的使用, 類型字段和對(duì)應(yīng)的實(shí)際類型將被創(chuàng)建.
實(shí)例4:
import numpy
a = numpy.dtype([('age', numpy.int8)])
print (a)
[('age', 'i1')]
[Finished in 0.1s]
實(shí)例5:
import numpy
# 數(shù)據(jù)類型應(yīng)用到ndarray對(duì)象
dt = numpy.dtype([('age', numpy.int8)])
a = numpy.array([(10,),(20,),(30,)], dtype = dt)
print (a)
[(10,) (20,) (30,)]
[Finished in 0.1s]
實(shí)例6:
# 類型字段名可以用于存取實(shí)際的age列
import numpy
dt = numpy.dtype([('age', numpy.int8)])
a = numpy.array([(10,),(20,),(30,)], dtype = dt)
print (a['age'])
[10 20 30]
[Finished in 0.1s]
下面的示例定義一個(gè)結(jié)構(gòu)化數(shù)據(jù)類型 student空厌,包含字符串字段 name,整數(shù)字段 age银酬,及浮點(diǎn)字段 marks嘲更,并將這個(gè) dtype 應(yīng)用到 ndarray 對(duì)象
實(shí)例7:
import numpy
student = numpy.dtype([('name','S20'),('age','i1'),('marks','f4')])
print (student)
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
[Finished in 0.1s]
實(shí)例8:
import numpy
student = numpy.dtype([('name','S20'),('age','i1'),('marks','f4')])
a = numpy.array([('abc', 21,50),('xyz', 18, 75)], dtype = student)
print (a)
[(b'abc', 21, 50.) (b'xyz', 18, 75.)]
[Finished in 0.1s]
dtype相當(dāng)于提前定義的一張數(shù)據(jù)表里面各個(gè)字段的 名字 數(shù)據(jù)類型, numpy.array()按照提前定義的字段, 依次填入進(jìn)去. 注意python2和3的區(qū)別.
每個(gè)內(nèi)建類型都已一個(gè)唯一定義它的字符代碼如下:
字符 | 對(duì)應(yīng)類型 |
---|---|
b | 布爾型 |
i | (有符號(hào)) 整型 |
u | 無符號(hào)整型 integer |
f | 浮點(diǎn)型 |
c | 復(fù)數(shù)浮點(diǎn)型 |
m | timedelta(時(shí)間間隔) |
M | datetime(日期時(shí)間) |
O | (Python) 對(duì)象 |
S, a | (byte-)字符串 |
U | Unicode |
V | 原始數(shù)據(jù) (void) |
numpy數(shù)組屬性
NumPy 數(shù)組的維數(shù)稱為秩(rank),秩就是軸的數(shù)量揩瞪,即數(shù)組的維度赋朦,一維數(shù)組的秩為 1,二維數(shù)組的秩為 2壮韭,以此類推北发。
在 NumPy中纹因,每一個(gè)線性的數(shù)組稱為是一個(gè)軸(axis)喷屋,也就是維度(dimensions)。比如說瞭恰,二維數(shù)組相當(dāng)于是兩個(gè)一維數(shù)組屯曹,其中第一個(gè)一維數(shù)組中每個(gè)元素又是一個(gè)一維數(shù)組。所以一維數(shù)組就是 NumPy 中的軸(axis)惊畏,第一個(gè)軸相當(dāng)于是底層數(shù)組恶耽,第二個(gè)軸是底層數(shù)組里的數(shù)組。而軸的數(shù)量——秩颜启,就是數(shù)組的維數(shù)偷俭。
很多時(shí)候可以聲明 axis。axis=0缰盏,表示沿著第 0 軸進(jìn)行操作涌萤,即對(duì)每一列進(jìn)行操作;axis=1口猜,表示沿著第1軸進(jìn)行操作负溪,即對(duì)每一行進(jìn)行操作。
NumPy 的數(shù)組中比較重要 ndarray 對(duì)象屬性有:
屬性 | 說明 |
---|---|
ndarray.ndim | 秩蛀序,即軸的數(shù)量或維度的數(shù)量 |
ndarray.shape | 數(shù)組的維度若未,對(duì)于矩陣较曼,n 行 m 列 |
ndarray.size | 數(shù)組元素的總個(gè)數(shù),相當(dāng)于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 對(duì)象的元素類型 |
ndarray.itemsize | ndarray 對(duì)象中每個(gè)元素的大小崖堤,以字節(jié)為單位 |
ndarray.flags | ndarray 對(duì)象的內(nèi)存信息 |
ndarray.real | ndarray元素的實(shí)部 |
ndarray.imag | ndarray 元素的虛部 |
ndarray.data | 包含實(shí)際數(shù)組元素的緩沖區(qū),由于一般通過數(shù)組的索引獲取元素耐床,所以通常不需要使用這個(gè)屬性倘感。 |
ndarray.ndim
返回?cái)?shù)組的維數(shù)等于秩
import numpy
a = numpy.arange(24)
print (a.ndim) # a現(xiàn)只有一個(gè)維度
# 現(xiàn)在調(diào)整其大小
b = a.reshape(2,4,3) # b現(xiàn)在擁有3個(gè)維度
print (b.ndim)
1
3
ndarray.shape
ndarray.shape 表示數(shù)組的維度,返回一個(gè)元組咙咽,這個(gè)元組的長(zhǎng)度就是維度的數(shù)目老玛,即 ndim 屬性(秩)。比如,一個(gè)二維數(shù)組蜡豹,其維度表示"行數(shù)"和"列數(shù)"麸粮。
ndarray.shape 也可以用于調(diào)整數(shù)組大小。
實(shí)例:
import numpy
a = numpy.array([[1,2,3],[4,5,6]])
print (a.shape) # 二行三列
(2, 3)
[Finished in 0.1s]
調(diào)整大小:
import numpy
a = numpy.array([[1,2,3],[4,5,6]])
a.shape = (3,2) # 三行二列
print (a)
[[1 2]
[3 4]
[5 6]]
[Finished in 0.1s]
numpy也提供了reshape函數(shù)來調(diào)整數(shù)組大小.
import numpy
a = numpy.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print (b)
[[1 2]
[3 4]
[5 6]]
[Finished in 0.3s]
ndarray.itemsize
ndarray.itemsize 以字節(jié)的形式返回?cái)?shù)組中每一個(gè)元素的大小镜廉。
例如弄诲,一個(gè)元素類型為 float64 的數(shù)組 itemsiz 屬性值為 8(float64 占用 64 個(gè) bits,每個(gè)字節(jié)長(zhǎng)度為 8娇唯,所以 64/8齐遵,占用 8 個(gè)字節(jié)),又如塔插,一個(gè)元素類型為 complex32 的數(shù)組 item 屬性為 4(32/8)梗摇。
實(shí)例:
import numpy
# 數(shù)組的dtype為int8(一個(gè)字節(jié))
a = numpy.array([1,99,2,3,4,5], dtype = numpy.int8)
print (a.itemsize)
# 數(shù)組的dtype現(xiàn)在為float64(8個(gè)字節(jié))
b = numpy.array([1,2,3,4,5], dtype = numpy.float64)
print (b.itemsize)
1
8
ndarray.flags
ndarray.flags 返回ndarray對(duì)象的內(nèi)存信息, 包含以下屬性.
屬性 | 描述 |
---|---|
C_CONTIGUOUS (C) | 數(shù)據(jù)是在一個(gè)單一的C風(fēng)格的連續(xù)段中 |
F_CONTIGUOUS (F) | 數(shù)據(jù)是在一個(gè)單一的Fortran風(fēng)格的連續(xù)段中 |
OWNDATA (O) | 數(shù)組擁有它所使用的內(nèi)存或從另一個(gè)對(duì)象中借用它 |
WRITEABLE (W) | 數(shù)據(jù)區(qū)域可以被寫入,將該值設(shè)置為 False想许,則數(shù)據(jù)為只讀 |
ALIGNED (A) | 數(shù)據(jù)和所有元素都適當(dāng)?shù)貙?duì)齊到硬件上 |
UPDATEIFCOPY (U) | 這個(gè)數(shù)組是其它數(shù)組的一個(gè)副本伶授,當(dāng)這個(gè)數(shù)組被釋放時(shí),原數(shù)組的內(nèi)容將被更新 |
import numpy
a = numpy.array([1,2,33])
print (a.flags)
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
[Finished in 0.1s]
numpy創(chuàng)建數(shù)組
ndarray數(shù)組除了可以使用底層ndarray構(gòu)造器來創(chuàng)建外, 也可以通過以下幾種方式來創(chuàng)建.
numpy.empty
numpy.empty 方法用來創(chuàng)建一個(gè)指定形狀(shape), 數(shù)據(jù)類型(dtype)且未初始化的數(shù)組:
numpy.empty(shape, dtype = float, order = 'C')
參數(shù) | 描述 |
---|---|
shape | 數(shù)組形狀 |
dtype | 數(shù)據(jù)類型流纹,可選 |
order | 有"C"和"F"兩個(gè)選項(xiàng),分別代表糜烹,行優(yōu)先和列優(yōu)先,在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序漱凝。 |
import numpy
a = numpy.empty([3,2], dtype = int)
print (a)
[[ 140605049899912 140605049899912]
[ 140605009638320 140605009626224]
[7205759936368964608 72483105062780931]]
[Finished in 0.1s]
數(shù)組元素為隨機(jī)值, 因?yàn)樗麄冞€未初始化
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ù)組 |
import numpy
# 默認(rèn)為浮點(diǎn)數(shù)
a = numpy.zeros(5)
print (a)
# 設(shè)置類型為整數(shù)
b = numpy.zeros((5,),dtype = numpy.int)
print (b)
# 自定義類型
c = numpy.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print (c)
[ 0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
[(0, 0) (0, 0)]]
[Finished in 0.1s]
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ù)組 |
實(shí)例:
import numpy
# 默認(rèn)為浮點(diǎn)數(shù)
a = numpy.ones(5)
print (a)
# 自定義類型
b = numpy.ones([3,3], dtype = [('x', int),('y', float)])
print (b)
[ 1. 1. 1. 1. 1.]
[[(1, 1.) (1, 1.) (1, 1.)]
[(1, 1.) (1, 1.) (1, 1.)]
[(1, 1.) (1, 1.) (1, 1.)]]
[Finished in 0.1s]
從已有數(shù)組創(chuàng)建數(shù)組
numpy.asarray
numpy.asarray 類似 numpy.array, 但 numpy.asarray 參數(shù)有三個(gè), 比numpy.array少兩個(gè)
numpy.asarray(a, dtype = None, order = None)
參數(shù)說明:
參數(shù) | 描述 |
---|---|
a | 任意形式的輸入?yún)?shù),可以是扣典,列表, 列表的元組, 元組, 元組的元組, 元組的列表妆毕,多維數(shù)組 |
dtype | 數(shù)據(jù)類型,可選 |
order | 可選贮尖,有"C"和"F"兩個(gè)選項(xiàng),分別代表笛粘,行優(yōu)先和列優(yōu)先,在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序湿硝。 |
實(shí)例:
列表裝換為ndarray:
import numpy
x = [1,2,3]
a = numpy.asarray(x)
print (a)
[1 2 3]
[Finished in 0.1s]
元組轉(zhuǎn)換為ndarray:
import numpy
x = (1,2,3)
a = numpy.asarray(x)
print (a)
[1 2 3]
元組列表轉(zhuǎn)換為ndarray:
import numpy
x = [(1,2,3),(4,5)]
a = numpy.asarray(x)
print (a)
[(1, 2, 3) (4, 5)]
[Finished in 0.1s]
加上dtype參數(shù):
import numpy
x = [1,2,3,4,5]
a = numpy.asarray(x, dtype = float)
print (a)
[ 1. 2. 3. 4. 5.]
[Finished in 0.1s]
numpy.frombuffer
numpy.frombuffer 用于實(shí)現(xiàn)動(dòng)態(tài)數(shù)組, numpy.frombuffer
接受buffer輸入?yún)?shù), 以流的形式讀入轉(zhuǎn)化成ndarray對(duì)象.
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
注: buffer是字符串的時(shí)候, python3 默認(rèn)str是unicode類型, 所以要轉(zhuǎn)換成bytestring在原str前加上b
參數(shù)說明:
參數(shù) | 描述 |
---|---|
buffer | 可以是任意對(duì)象薪前,會(huì)以流的形式讀入。 |
dtype | 返回?cái)?shù)組的數(shù)據(jù)類型关斜,可選 |
count | 讀取的數(shù)據(jù)數(shù)量示括,默認(rèn)為-1,讀取所有數(shù)據(jù)痢畜。 |
offset | 讀取的起始位置垛膝,默認(rèn)為0鳍侣。 |
python3:
import numpy
s = b'hello word'
a = numpy.frombuffer(s, dtype = 'S1')
print (a)
[b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'd']
[Finished in 0.1s]
python2:
import numpy
s = 'hello word'
a = numpy.frombuffer(s, dtype = 'S1')
print (a)
pig@deep:~/Desktop/note/python/numpy$ python test.py
['h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'd']
numpy.fromiter
numpy.fromiter 方法從可迭代對(duì)象中建立ndarray 對(duì)象, 返回一維數(shù)組
numpy.fromiter(iterable, dtype, count = -1)
參數(shù) | 描述 |
---|---|
iterable | 可迭代對(duì)象 |
dtype | 返回?cái)?shù)組的數(shù)據(jù)類型 |
count | 讀取的數(shù)據(jù)數(shù)量,默認(rèn)為-1吼拥,讀取所有數(shù)據(jù) |
import numpy
# 使用range函數(shù)創(chuàng)建列表對(duì)象
list = range(5)
it = iter(list)
# 使用迭代器創(chuàng)建 ndarray
a = numpy.fromiter(it, dtype = float)
print (a)
[ 0. 1. 2. 3. 4.]
[Finished in 0.1s]
numpy從數(shù)值范圍創(chuàng)建數(shù)組
numpy.arange
numpy 包中的使用arange函數(shù)創(chuàng)建數(shù)值范圍并返回ndarray對(duì)象, 函數(shù)格式如下:
numpy.arange(start, stop, step, dtype)
根據(jù)start與stop指定的范圍以及step設(shè)定的步長(zhǎng), 生成一個(gè)ndarray
參數(shù)說明:
參數(shù) | 描述 |
---|---|
start |
起始值倚聚,默認(rèn)為0
|
stop |
終止值(不包含) |
step |
步長(zhǎng),默認(rèn)為1
|
dtype |
返回ndarray 的數(shù)據(jù)類型凿可,如果沒有提供惑折,則會(huì)使用輸入數(shù)據(jù)的類型。 |
實(shí)例:
生成0-5的數(shù)組
import numpy
a = numpy.arange(5, dtype = float)
print (a)
[ 0. 1. 2. 3. 4.]
[Finished in 0.1s]
設(shè)置起始值, 終止值及步長(zhǎng):
import numpy
a = numpy.arange(10,20,2, dtype = float)
print (a)
[ 10. 12. 14. 16. 18.]
[Finished in 0.1s]
numpy.linspace
numpy.linspace
函數(shù)用于創(chuàng)建一個(gè)一維數(shù)組, 數(shù)組是一個(gè)等差數(shù)列構(gòu)成的, 格式如下:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
參數(shù)說明:
參數(shù) | 描述 |
---|---|
start |
序列的起始值 |
stop |
序列的終止值枯跑,如果endpoint 為true 惨驶,該值包含于數(shù)列中 |
num |
要生成的等步長(zhǎng)的樣本數(shù)量,默認(rèn)為50
|
endpoint |
該值為 true 時(shí)敛助,數(shù)列中中包含stop 值粗卜,反之不包含,默認(rèn)是True辜腺。 |
retstep |
如果為 True 時(shí)休建,生成的數(shù)組中會(huì)顯示間距乍恐,反之不顯示评疗。 |
dtype |
ndarray 的數(shù)據(jù)類型 |
實(shí)例:
設(shè)置起始點(diǎn)為1, 終止點(diǎn)為10, 數(shù)列個(gè)數(shù)為10
import numpy
a = numpy.linspace(1,10,10, dtype = float)
print (a)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[Finished in 0.1s]
設(shè)置元素為1的等差數(shù)列:
import numpy
a = numpy.linspace(1,1,10, dtype = float)
print (a)
[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[Finished in 0.1s]
將endpoint設(shè)為false, 不包含終止值;
import numpy
a = numpy.linspace(10,20,5,endpoint = False, dtype = float)
print (a)
[ 10. 12. 14. 16. 18.]
[Finished in 0.1s]
如果將endpoint 設(shè)為true, 則會(huì)包含20.
以下實(shí)例設(shè)置間距:
import numpy
a = numpy.linspace(1,10,10,retstep = True)
print (a)
# 拓展列子
b = numpy.linspace(1,10,10).reshape([10,1])
print (b)
(array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
[[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[ 10.]]
[Finished in 0.1s]
numpy.logspace
numpy.logspace
函數(shù)用于創(chuàng)建一個(gè)等比數(shù)列格式如下:
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
base參數(shù)意思是取對(duì)數(shù)的時(shí)候log的下標(biāo)
參數(shù) | 描述 |
---|---|
start |
序列的起始值為:base ** start |
stop |
序列的終止值為:base ** stop。如果endpoint 為true 茵烈,該值包含于數(shù)列中 |
num |
要生成的等步長(zhǎng)的樣本數(shù)量百匆,默認(rèn)為50
|
endpoint |
該值為 true 時(shí),數(shù)列中中包含stop 值呜投,反之不包含加匈,默認(rèn)是True。 |
base |
對(duì)數(shù) log 的底數(shù)仑荐。 |
dtype |
ndarray 的數(shù)據(jù)類型 |
import numpy
# 默認(rèn)底數(shù)是10
a = numpy.logspace(1.0, 2.0, num=10)
print (a)
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
[Finished in 0.1s]
import numpy
# 底數(shù)是2
a = numpy.logspace(0, 9,10, base=2)
print (a)
[ 1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
[Finished in 0.1s]
numpy切片和索引
ndarray對(duì)象的內(nèi)容可以通過索引或切片來訪問和修改雕拼,與 Python 中 list 的切片操作一樣。
ndarray 數(shù)組可以基于 0 - n 的下標(biāo)進(jìn)行索引粘招,切片對(duì)象可以通過內(nèi)置的 slice 函數(shù)啥寇,并設(shè)置 start, stop 及 step 參數(shù)進(jìn)行,從原數(shù)組中切割出一個(gè)新數(shù)組洒扎。
>>> import numpy
>>> a = numpy.arange(10)
>>> s = slice(2,7,2) # 從索引2 開始索引到7停止, 間隔為2
>>> print (a[s])
[2 4 6]
通過arange()函數(shù)創(chuàng)建ndarray對(duì)象, 然后, 分別設(shè)置起始, 終止和步長(zhǎng)的參數(shù)為2, 7 和2.
也可以通過冒號(hào)分割切片參數(shù)start:stop:step
來進(jìn)行切片操作:
>>> import numpy
>>> a = numpy.arange(10)
>>> b = a[2:7:2]
>>> print (b)
[2 4 6]
>>>
索引和list中的索引差不多 單個(gè)參數(shù)[2] , [2:]索引開始后面的所有項(xiàng)都將提取,如果[2:7] 則提取兩個(gè)索引之間的項(xiàng)(不包括停止索引)
多維數(shù)組同樣適用上述索引提取方法:
>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> print (a)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> print (a[1:])
[[4 5 6]
[7 8 9]]
>>>
切片還可以包括省略號(hào)...
來使選擇元組的長(zhǎng)度與數(shù)組的維度相同, 如果在行位置使用省略號(hào), 他將返回包含行中元素的ndarray
>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> print (a[...,1]) # 第二列元素
[2 5 8]
>>> print (a[1,...]) # 第二行元素
[4 5 6]
>>> print (a[...,1:]) # 第二例及剩下的所有元素
[[2 3]
[5 6]
[8 9]]
>>>
numpy 高級(jí)索引
NumPy 比一般的 Python 序列提供更多的索引方式辑甜。除了之前看到的用整數(shù)和切片的索引外,數(shù)組可以由整數(shù)數(shù)組索引袍冷、布爾索引及花式索引磷醋。
整數(shù)數(shù)組索引
以下實(shí)例獲取數(shù)組中(0,0),(1,1)和(2,0)位置處的元素胡诗。
import numpy
x = numpy.array([[1,2],[3,4],[5,6]])
y = x[[0,1,2], [0,1,0]]
print (y)
[1 4 5]
[Finished in 0.1s]
區(qū)別:
import numpy
x = numpy.array([[1,2],[3,4],[5,6]])
y = x[[0,1], [0,1]]
print (y)
print (x)
[1 4]
[[1 2]
[3 4]
[5 6]]
[Finished in 0.1s]
獲取4x3數(shù)組中的四個(gè)角元素, 行索引為[0,0]和[3,3] 而列索引為[0,2]和[0,2]
import numpy
x = numpy.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print ('數(shù)組:')
print (x)
print ('\n')
rows = numpy.array([[0,0],[3,3]])
cols = numpy.array([[0,2],[0,2]])
y = x[rows, cols]
print ('角上的四個(gè)元素:')
print (y)
坐標(biāo)為00 02 30 32
數(shù)組:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
角上的四個(gè)元素:
[[ 0 2]
[ 9 11]]
[Finished in 0.1s]
返回結(jié)果是包含每個(gè)角元素的ndarray對(duì)象
可以借助切片:
或...
與索引數(shù)組組合
import numpy
a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b = a[1:3,1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print (a)
print (b)
print (c)
print (d)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[5 6]
[8 9]]
[[5 6]
[8 9]]
[[2 3]
[5 6]
[8 9]]
[Finished in 0.1s]
要獲取元素 的行索引集合, 列索引集合來獲取元素, 如果是獲取某個(gè)區(qū)域的元素, 則使用:
布爾索引
我們可以通過一個(gè)布爾數(shù)組來索引目標(biāo)數(shù)組邓线。
布爾索引通過布爾運(yùn)算(如:比較運(yùn)算符)來獲取符合指定條件的元素的數(shù)組淌友。
以下實(shí)例獲取大于 5 的元素:
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我們的數(shù)組是:')
print (x)
print ('\n')
# 現(xiàn)在我們會(huì)打印出大于 5 的元素
print ('大于 5 的元素是:')
print (x[x > 5])
我們的數(shù)組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素是:
[ 6 7 8 9 10 11]
[Finished in 0.3s]
以下使用~
(取補(bǔ)運(yùn)算符) 來過濾NaN
import numpy
a = numpy.array([numpy.nan, 1, 2, numpy.nan, 3, 4, 5])
print (a[~numpy.isnan(a)])
[ 1. 2. 3. 4. 5.]
[Finished in 0.1s]
從數(shù)組中過濾掉非復(fù)數(shù)元素:
import numpy
a = numpy.array([1, 2+6j,5,3.5])
print (a[numpy.iscomplex(a)])
[ 2.+6.j]
[Finished in 0.1s]
花式索引
花式索引指的是利用整數(shù)數(shù)組進(jìn)行索引。
花式索引根據(jù)索引數(shù)組的值作為目標(biāo)數(shù)組的某個(gè)軸的下標(biāo)來取值骇陈。對(duì)于使用一維整型數(shù)組作為索引亩进,如果目標(biāo)是一維數(shù)組,那么索引的結(jié)果就是對(duì)應(yīng)位置的元素缩歪;如果目標(biāo)是二維數(shù)組归薛,那么就是對(duì)應(yīng)下標(biāo)的行。
花式索引跟切片不一樣匪蝙,它總是將數(shù)據(jù)復(fù)制到新數(shù)組中主籍。
-
傳入順序索引數(shù)組
import numpy a = numpy.arange(32) x = a.reshape((8,4)) print (a) print (x) print (x[[4,2,1,7]]) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31] [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19] [20 21 22 23] [24 25 26 27] [28 29 30 31]] [[16 17 18 19] [ 8 9 10 11] [ 4 5 6 7] [28 29 30 31]] [Finished in 0.1s]
傳入倒敘索引數(shù)組
import numpy
a = numpy.arange(32)
x = a.reshape((8,4))
print (a)
print (x)
print (x[[-4,-2,-1,-7]])
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[16 17 18 19]
[24 25 26 27]
[28 29 30 31]
[ 4 5 6 7]]
[Finished in 0.1s]
- 傳入多個(gè)索引數(shù)組(要使用np.ix_)
import numpy
a = numpy.arange(32)
x = a.reshape((8,4))
print (x)
print (x[numpy.ix_([1,5,7,2],[0,3,1,2])])
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
[Finished in 0.1s]
行索引配合列索引
numpy廣播(broadcast)
廣播(Broadcast)是 numpy 對(duì)不同形狀(shape)的數(shù)組進(jìn)行數(shù)值計(jì)算的方式, 對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行逛球。
如果兩個(gè)數(shù)組 a 和 b 形狀相同千元,即滿足 a.shape == b.shape,那么 a*b 的結(jié)果就是 a 與 b 數(shù)組對(duì)應(yīng)位相乘颤绕。這要求維數(shù)相同幸海,且各維度的長(zhǎng)度相同。
[1,2,3,4] * [10,20,30,40]
import numpy
a = numpy.array([1,2,3,4])
b = numpy.array([10,20,30,40])
c = a * b
print (c)
[ 10 40 90 160]
[Finished in 0.1s]
當(dāng)運(yùn)算中的兩個(gè)數(shù)組形狀不同時(shí), numpy將自動(dòng)觸發(fā)廣播機(jī)制.:
import numpy
a = numpy.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = numpy.array([1,2,3])
print (a + b)
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
[Finished in 0.1s]
廣播的規(guī)則:
- 讓所有輸入數(shù)組都向其中形狀最長(zhǎng)的數(shù)組看齊奥务,形狀中不足的部分都通過在前面加 1 補(bǔ)齊物独。
- 輸出數(shù)組的形狀是輸入數(shù)組形狀的各個(gè)維度上的最大值。
- 如果輸入數(shù)組的某個(gè)維度和輸出數(shù)組的對(duì)應(yīng)維度的長(zhǎng)度相同或者其長(zhǎng)度為 1 時(shí)氯葬,這個(gè)數(shù)組能夠用來計(jì)算挡篓,否則出錯(cuò)。
- 當(dāng)輸入數(shù)組的某個(gè)維度的長(zhǎng)度為 1 時(shí)帚称,沿著此維度運(yùn)算時(shí)都用此維度上的第一組值官研。
簡(jiǎn)單理解:對(duì)兩個(gè)數(shù)組,分別比較他們的每一個(gè)維度(若其中一個(gè)數(shù)組沒有當(dāng)前維度則忽略)闯睹,滿足:
- 數(shù)組擁有相同形狀戏羽。
- 當(dāng)前維度的值相等。
- 當(dāng)前維度的值有一個(gè)是 1楼吃。
若條件不滿足始花,拋出 "ValueError: frames are not aligned" 異常。
tile()
函數(shù)就是將原矩陣橫向, 縱向的復(fù)制.
tile(mat, (1,4))
復(fù)制為原來的四倍
numpy 迭代數(shù)組
NumPy 迭代器對(duì)象 numpy.nditer 提供了一種靈活訪問一個(gè)或者多個(gè)數(shù)組元素的方式所刀。
迭代器最基本的任務(wù)的可以完成對(duì)數(shù)組元素的訪問衙荐。
接下來我們使用 arange() 函數(shù)創(chuàng)建一個(gè) 2X3 數(shù)組,并使用 nditer 對(duì)它進(jìn)行迭代浮创。
import numpy as np
a = np.arange(6).reshape(2,3)
print ('原數(shù)組:')
print (a)
print ('\n')
for x in np.nditer(a):
print (x, end=', ')
print ('\n')
原數(shù)組:
[[0 1 2]
[3 4 5]]
0, 1, 2, 3, 4, 5,
[Finished in 0.1s]
以上實(shí)例不是使用標(biāo)準(zhǔn) C 或者 Fortran 順序忧吟,選擇的順序是和數(shù)組內(nèi)存布局一致的,這樣做是為了提升訪問的效率斩披,默認(rèn)是行序優(yōu)先(row-major order溜族,或者說是 C-order)讹俊。
這反映了默認(rèn)情況下只需訪問每個(gè)元素,而無需考慮其特定順序煌抒。我們可以通過迭代上述數(shù)組的轉(zhuǎn)置來看到這一點(diǎn)仍劈,并與以 C 順序訪問數(shù)組轉(zhuǎn)置的 copy 方式做對(duì)比,如下實(shí)例:
import numpy as np
a = np.arange(6).reshape(2,3)
for x in np.nditer(a.T):
print (x, end=', ')
print ('\n')
for x in np.nditer(a.T.copy(order='C')):
print (x, end=', ')
print ('\n')
0, 1, 2, 3, 4, 5,
0, 3, 1, 4, 2, 5,
[Finished in 0.1s]
從上述例子可以看出寡壮,a 和 a.T 的遍歷順序是一樣的贩疙,也就是他們?cè)趦?nèi)存中的存儲(chǔ)順序也是一樣的,但是 a.T.copy(order = 'C') 的遍歷結(jié)果是不同的况既,那是因?yàn)樗颓皟煞N的存儲(chǔ)方式是不一樣的这溅,默認(rèn)是按行訪問。
控制便來順序
-
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)先
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print ('原數(shù)組:')
print (a)
print ('\n')
print ('轉(zhuǎn)置:')
b = a.T
print (b)
print ('\n')
print ('C排序:')
c = b.copy(order='C')
print (c)
for x in np.nditer(c):
print (x, end=", ")
print ('\n')
print ('-----F-------')
c = b.copy(order='F')
print (c)
for x in np.nditer(c):
print (x, end=', ')
原數(shù)組:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
轉(zhuǎn)置:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
C排序:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55,
-----F-------
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, [Finished in 0.1s]
b=a.T
表示數(shù)組的轉(zhuǎn)置, 默認(rèn)情況下nditer是以行來讀取的, 當(dāng)然也可以直接以列來讀取, 使用nditer指定order以什么方式讀取如下:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print (str('原').center(15,'*'))
print (a)
print ('\n')
print (str('C').center(15,'*'))
for x in np.nditer(a, order = 'C'):
print (x, end = ', ')
print ('\n')
print ('F'.center(15, '*'))
for x in np.nditer(a, order = 'F'):
print (x, end = ', ')
*******原*******
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
*******C*******
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,
*******F*******
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, [Finished in 0.1s]
修改數(shù)組中元素的值
nditer 對(duì)象有另一個(gè)可選參數(shù)op_flags 默認(rèn)情況下, nditer將視待迭代遍歷的數(shù)組為只讀對(duì)象(read-only), 為了在遍歷數(shù)組的同時(shí), 實(shí)現(xiàn)對(duì)數(shù)組元素值得修改, 必須指定read-write 或者 write-only 的模式.
import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('原始數(shù)組'.center(15,'*'))
print (a)
print ('\n')
for x in numpy.nditer(a, op_flags=['readwrite']):
x[...]=2*x
print ('修改后'.center(15,'*'))
print (a)
******原始數(shù)組*****
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
******修改后******
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
[Finished in 0.1s]
使用外部循環(huán):
nditer 類的構(gòu)造器擁有flags參數(shù), 他可以接受下列值:
參數(shù) | 描述 |
---|---|
c_index |
可以跟蹤 C 順序的索引 |
f_index |
可以跟蹤 Fortran 順序的索引 |
multi-index |
每次迭代可以跟蹤一種索引類型 |
external_loop |
給出的值是具有多個(gè)值的一維數(shù)組棒仍,而不是零維數(shù)組 |
import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('原始數(shù)組'.center(20,'*'))
print (a)
print ('\n')
print ('修改后的數(shù)組:'.center(20,'*'))
for x in numpy.nditer(a, flags = ['external_loop'], order = 'F'):
print (x, end=", ")
********原始數(shù)組********
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
******修改后的數(shù)組:*******
[ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55], [Finished in 0.1s]
廣播迭代
如果兩個(gè)數(shù)組是可廣播的, nditer組合對(duì)象能夠同時(shí)迭代他們, 假設(shè)數(shù)組a的維度為3x4, 數(shù)組b的維度為1x4 則使用以下迭代器(數(shù)組b被廣播到a的大小)
import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('第一個(gè)數(shù)組'.center(20, "*"))
print (a)
print ('\n')
print ('第二個(gè)數(shù)組'.center(20, "*"))
b = numpy.array([1,2,3,4],dtype = int)
print (b)
print ('\n')
print ('修改之后的數(shù)組'.center(20, "*"))
for x,y in numpy.nditer([a,b]):
print ('%d:%d' % (x, y), end=', ')
*******第一個(gè)數(shù)組********
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
*******第二個(gè)數(shù)組********
[1 2 3 4]
******修改之后的數(shù)組*******
0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4, [Finished in 0.1s]
數(shù)組操作
處理數(shù)組大概分為以下幾類:
- 修改數(shù)組形狀
- 翻轉(zhuǎn)數(shù)組
- 修改數(shù)組 維度
- 連接數(shù)組
- 分割數(shù)組
- 數(shù)組元素的添加與刪除
修改數(shù)組形狀
函數(shù) | 描述 |
---|---|
reshape |
不改變數(shù)據(jù)的條件下修改形狀 |
flat |
數(shù)組元素迭代器 |
flatten |
返回一份數(shù)組拷貝悲靴,對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組 |
ravel |
返回展開數(shù)組 |
numpy.reshape
numpy.reshape 函數(shù)可以在不改變數(shù)據(jù)的條件下修改形狀,格式如下: numpy.reshape(arr, newshape, order='C')
-
arr
:要修改形狀的數(shù)組 -
newshape
:整數(shù)或者整數(shù)數(shù)組莫其,新的形狀應(yīng)當(dāng)兼容原有形狀 - order:'C' -- 按行癞尚,'F' -- 按列,'A' -- 原順序乱陡,'k' -- 元素在內(nèi)存中的出現(xiàn)順序浇揩。
import numpy as np
a = np.arange(8)
print ('原始數(shù)組:')
print (a)
print ('\n')
b = a.reshape(4,2)
print ('修改后的數(shù)組:')
print (b)
輸出結(jié)果如下:
原始數(shù)組:
[0 1 2 3 4 5 6 7]
修改后的數(shù)組:
[[0 1]
[2 3]
[4 5]
[6 7]]
numpy.ndarray.flat
numpy.ndarray.flat 是一個(gè)數(shù)組元素迭代器, 實(shí)例:
import numpy
a = numpy.arange(9).reshape(3,3)
print ('原數(shù)組'.center(20,'*'))
for row in a:
print (row)
# 對(duì)數(shù)組中每個(gè)元素都進(jìn)行處理, 可以使用flat屬性, 該屬性是一個(gè)數(shù)組元素迭代器.
print ('迭代后的數(shù)組'.center(20, '*'))
for element in a.flat:
print (element)
********原數(shù)組*********
[0 1 2]
[3 4 5]
[6 7 8]
*******迭代后的數(shù)組*******
0
1
2
3
4
5
6
7
8
[Finished in 0.3s]
numpy.ndarray.flatten
numpy.ndarray.flatten 返回一份數(shù)組拷貝, 對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組, 格式:
ndarray.flatten(order='C')
order
'C'--按行, 'F'-- 按列, 'A' -- 按原順序, 'K' -- 元素在內(nèi)存中的出現(xiàn)順序.
import numpy
a = numpy.arange(8).reshape(2,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('展開數(shù)組:'.center(20, '*'))
print (a.flatten())
print ('\n')
print ('F順序展開的數(shù)組')
print (a.flatten(order='F'))
*********原**********
[[0 1 2 3]
[4 5 6 7]]
*******展開數(shù)組:********
[0 1 2 3 4 5 6 7]
F順序展開的數(shù)組
[0 4 1 5 2 6 3 7]
[Finished in 0.1s]
numpy.ravel
numpy.ravel ()展平的數(shù)組元素, 順序通常是"C風(fēng)格", 返回?cái)?shù)組視圖(view, 有點(diǎn)類似C/C++引用reference的意味), 修改會(huì)影響原始數(shù)組,
numpy.ravel(a, order = 'C')
實(shí)例:
import numpy
a = numpy.arange(8).reshape(2,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('調(diào)用ravel函數(shù)之后'.center(20, '*'))
print (a.ravel())
print ('\n')
print ('F順序調(diào)用ravel函數(shù)的數(shù)組')
print (a.ravel(order = 'F'))
*********原**********
[[0 1 2 3]
[4 5 6 7]]
****調(diào)用ravel函數(shù)之后*****
[0 1 2 3 4 5 6 7]
F順序調(diào)用ravel函數(shù)的數(shù)組
[0 4 1 5 2 6 3 7]
[Finished in 0.1s]
翻轉(zhuǎn)數(shù)組
函數(shù) | 描述 |
---|---|
transpose |
對(duì)換數(shù)組的維度 |
ndarray.T |
和 self.transpose() 相同 |
rollaxis |
向后滾動(dòng)指定的軸 |
swapaxes |
對(duì)換數(shù)組的兩個(gè)軸 |
numpy.transpose
numpy.transpose
函數(shù)用于對(duì)換數(shù)組的維度
numpy.transpose(arr, axes)
arr
要操作的數(shù)組
axes
整數(shù)列表, 對(duì)應(yīng)維度, 通常所有維度都會(huì)對(duì)換
import numpy
a = numpy.arange(12).reshape(3,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('對(duì)換數(shù)組'.center(20, '*'))
print (numpy.transpose(a))
print ('\n')
*********原**********
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
********對(duì)換數(shù)組********
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[Finished in 0.2s]
numpy.ndarray.T 類似numpy.transpose:
import numpy
a = numpy.arange(12).reshape(3,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('轉(zhuǎn)置數(shù)組'.center(20, '*'))
print (a.T)
print ('\n')
*********原**********
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
********轉(zhuǎn)置數(shù)組********
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[Finished in 0.1s]
numpy.rollaxis
numpy.rollaxis
函數(shù)向后滾動(dòng)特定的軸到一個(gè)特定位置, 格式如下:
numpy.rollaxis(arr, axis, start)
arr
數(shù)組
axis
向后滾動(dòng)的軸, 其他軸的相對(duì)位置不會(huì)改變
start
默認(rèn)為0, 表示完整的滾動(dòng), 回滾到特定的位置
import numpy
a = numpy.arange(8).reshape(2,2,2)
print('原'.center(20, '*'))
print (a)
print ('\n')
# 將軸2滾動(dòng)到軸0(寬度到深度)
print ('調(diào)用rollaxis函數(shù)'.center(20, '*'))
print (numpy.rollaxis(a,2))
# 將軸0 滾動(dòng)到軸1位置, (寬度到高度)
print ('\n')
print ('調(diào)用rollaxis函數(shù)')
print (numpy.rollaxis(a,2,1))
*********原**********
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
****調(diào)用rollaxis函數(shù)****
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
調(diào)用rollaxis函數(shù)
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
[Finished in 0.1s]
numpy.swapaxes
numpy.swapaxes
函數(shù)用于交換數(shù)組的兩個(gè)軸, 格式如下:
numpy.swapaxes(arr, sxis1, axis2)
arr
數(shù)組
axis1
對(duì)應(yīng)第一個(gè)軸的整數(shù)
axis2
對(duì)應(yīng)第二個(gè)軸的整數(shù)
import numpy
a = numpy.arange(8).reshape(2,2,2)
print('原'.center(20, '*'))
print (a)
print ('\n')
# 現(xiàn)在交換軸0(深度方向)到軸2(寬度方向)
print ('調(diào)用swapaxes函數(shù)后的數(shù)組'.center(20, '*'))
print (numpy.swapaxes(a, 2, 0))
*********原**********
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
**調(diào)用swapaxes函數(shù)后的數(shù)組**
[[[0 4]
[2 6]]
[[1 5]
[3 7]]]
[Finished in 0.1s]
修改數(shù)組維度
維度 | 描述 |
---|---|
broadcast |
產(chǎn)生模仿廣播的對(duì)象 |
broadcast_to |
將數(shù)組廣播到新形狀 |
expand_dims |
擴(kuò)展數(shù)組的形狀 |
squeeze |
從數(shù)組的形狀中刪除一維條目 |
numpy.broadcast
numpy.broadcast 用于模仿廣播的對(duì)象, 它返回一個(gè)對(duì)象, 該對(duì)象封裝了將一個(gè)數(shù)組廣播到另一個(gè)數(shù)組的結(jié)果, 該函數(shù)使用兩個(gè)數(shù)組作為輸入?yún)?shù), 如下實(shí)例:
import numpy as np
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
# 對(duì) y 廣播 x
b = np.broadcast(x,y)
# 它擁有 iterator 屬性,基于自身組件的迭代器元組
print (b)
print ('對(duì) y 廣播 x:')
r,c = b.iters
# Python3.x 為 next(context) 蛋褥,Python2.x 為 context.next()
print (next(r), next(c))
print (next(r), next(c))
print ('\n')
# shape 屬性返回廣播對(duì)象的形狀
print ('廣播對(duì)象的形狀:')
print (b.shape)
print ('\n')
# 手動(dòng)使用 broadcast 將 x 與 y 相加
b = np.broadcast(x,y)
c = np.empty(b.shape)
print ('手動(dòng)使用 broadcast 將 x 與 y 相加:')
print (c.shape)
print ('\n')
c.flat = [u + v for (u,v) in b]
print ('調(diào)用 flat 函數(shù):')
print (c)
print ('\n')
# 獲得了和 NumPy 內(nèi)建的廣播支持相同的結(jié)果
print ('x 與 y 的和:')
print (x + y)
<numpy.broadcast object at 0x55c6b266fdb0>
對(duì) y 廣播 x:
1 4
1 5
廣播對(duì)象的形狀:
(3, 3)
手動(dòng)使用 broadcast 將 x 與 y 相加:
(3, 3)
調(diào)用 flat 函數(shù):
[[ 5. 6. 7.]
[ 6. 7. 8.]
[ 7. 8. 9.]]
x 與 y 的和:
[[5 6 7]
[6 7 8]
[7 8 9]]
[Finished in 0.1s]
numpy.broadcast_to
numpy.broadcast_to
函數(shù)將數(shù)組廣播到新形狀, 他在原始數(shù)組上返回只讀視圖, 它通常不連續(xù), 如果新形狀不符合numpy的廣播規(guī)則, 該函數(shù)可能會(huì)拋出ValueError
numpy.broadcast_to(array, shape, subok)
import numpy
a = numpy.arange(4).reshape(1,4)
print ('原數(shù)組:')
print (a)
print ('\n')
print ('調(diào)用broadcast_to函數(shù)之后')
print (numpy.broadcast_to(a,(2,4)))
原數(shù)組:
[[0 1 2 3]]
調(diào)用broadcast_to函數(shù)之后
[[0 1 2 3]
[0 1 2 3]]
[Finished in 0.1s]
numpy.expand_dims
numpy.expand_dims
函數(shù)通過指定位置插入新的軸來擴(kuò)展數(shù)組形狀, 函數(shù)格式:
numpy.expand_dims(arr, axis)
arr
輸入的數(shù)組
axis
新軸插入的位置, 0 表示行, 1 表示列
import numpy
x = numpy.array(([1,2],[3,4]))
print ('數(shù)組x')
print (x)
print ('\n')
y = numpy.expand_dims(x, axis = 0)
print ('數(shù)組y')
print (y)
print ('\n')
print ('數(shù)組x和y的形狀')
print (x.shape, y.shape)
print ('\n')
# 在軸1 位置插入軸
y = numpy.expand_dims(x, axis = 1)
print ('在位置1 插入軸之后的數(shù)組')
print (y)
print ('\n')
print ('x.ndim y.ndim')
print (x.ndim, y.ndim)
print ('\n')
print ('x.shape, y.shape')
print (x.shape, y.shape)
數(shù)組x
[[1 2]
[3 4]]
數(shù)組y
[[[1 2]
[3 4]]]
數(shù)組x和y的形狀
(2, 2) (1, 2, 2)
在位置1 插入軸之后的數(shù)組
[[[1 2]]
[[3 4]]]
x.ndim y.ndim
2 3
x.shape, y.shape
(2, 2) (2, 1, 2)
[Finished in 0.1s]
numpy.squeeze
numpy.squeeze
從給定數(shù)組的形狀中刪除一維的條目,
numpy.squeeze(arr, axis)
arr
輸入數(shù)組
axis
整數(shù)或整數(shù)元組, 用于選擇形狀中的一維條目的子集
import numpy
x = numpy.arange(9).reshape(1,3,3)
print ('數(shù)組x')
print (x)
print ('\n')
y = numpy.squeeze(x)
print ('數(shù)組y')
print (y)
print ('\n')
print ('x.shape, y.shape')
print (x.shape, y.shape)
數(shù)組x
[[[0 1 2]
[3 4 5]
[6 7 8]]]
數(shù)組y
[[0 1 2]
[3 4 5]
[6 7 8]]
x.shape, y.shape
(1, 3, 3) (3, 3)
[Finished in 0.1s]
連接數(shù)組
函數(shù) | 描述 |
---|---|
concatenate |
連接沿現(xiàn)有軸的數(shù)組序列 |
stack |
沿著新的軸加入一系列數(shù)組临燃。 |
hstack |
水平堆疊序列中的數(shù)組(列方向) |
vstack |
豎直堆疊序列中的數(shù)組(行方向) |
concatenate
用于沿著指定軸連接相同形狀的兩個(gè)或多個(gè)數(shù)組
numpy.concatenate((a1,a2, ...),axis)
a1,a2,a3,...
相同類型的數(shù)組
axis
沿著它連接數(shù)組的軸, 默認(rèn)為0
import numpy
a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')
# 兩個(gè)數(shù)組的維度相同
print ('沿軸0連接兩個(gè)數(shù)組:')
print (numpy.concatenate((a,b)))
print ('\n')
print ('沿著軸1連接兩個(gè)數(shù)組')
print (numpy.concatenate((a,b),axis = 1))
第一個(gè)數(shù)組
[[1 2]
[3 4]]
第二個(gè)數(shù)組
[[5 6]
[7 8]]
沿軸0連接兩個(gè)數(shù)組:
[[1 2]
[3 4]
[5 6]
[7 8]]
沿著軸1連接兩個(gè)數(shù)組
[[1 2 5 6]
[3 4 7 8]]
[Finished in 0.1s]
numpy.stack
用于沿新軸連接數(shù)組序列
numpy.stack(arrays, axis)
arrays
相同形狀的數(shù)組序列
axis
返回?cái)?shù)組中的軸, 輸入數(shù)組沿著它來堆疊
import numpy
a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')
print ('沿著0堆疊兩個(gè)數(shù)組')
print (numpy.stack((a,b),0))
print ('\n')
print ('沿著列堆疊兩個(gè)數(shù)組')
print (numpy.stack((a,b),1))
第一個(gè)數(shù)組
[[1 2]
[3 4]]
第二個(gè)數(shù)組
[[5 6]
[7 8]]
沿著0堆疊兩個(gè)數(shù)組
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
沿著列堆疊兩個(gè)數(shù)組
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
[Finished in 0.1s]
numpy.hstack
是numpy.stack的變體睛驳, 通過水平堆疊來生成數(shù)組
import numpy
a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')
print ('水平堆疊')
c = numpy.hstack((a,b))
print (c)
第一個(gè)數(shù)組
[[1 2]
[3 4]]
第二個(gè)數(shù)組
[[5 6]
[7 8]]
水平堆疊
[[1 2 5 6]
[3 4 7 8]]
[Finished in 0.1s]
numpy.vstack
通過垂直堆疊來生成數(shù)組
import numpy
a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')
print ('垂直堆疊')
print (numpy.vstack((a,b)))
第一個(gè)數(shù)組
[[1 2]
[3 4]]
第二個(gè)數(shù)組
[[5 6]
[7 8]]
垂直堆疊
[[1 2]
[3 4]
[5 6]
[7 8]]
[Finished in 0.1s]
分割數(shù)組
函數(shù) | 數(shù)組及操作 |
---|---|
split |
將一個(gè)數(shù)組分割為多個(gè)子數(shù)組 |
hsplit |
將一個(gè)數(shù)組水平分割為多個(gè)子數(shù)組(按列) |
vsplit |
將一個(gè)數(shù)組垂直分割為多個(gè)子數(shù)組(按行) |
numpy.split
沿特定的軸將數(shù)組分割為子數(shù)組
numpy.split(ary, indices_or_sections, axis)
ary
被分割的數(shù)組
indices_or_se_ctinos
如果是一個(gè)整數(shù)就用該數(shù)平均切分烙心,如果是一個(gè)數(shù)組,為沿軸切分的位置(左開右閉)
沿哪個(gè)維度切割
0乏沸,1
import numpy
a = numpy.arange(9)
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('將數(shù)組分為三個(gè)大小相等的子數(shù)組')
b = numpy.split(a, 3)
print (b)
print ('\n')
print ('將數(shù)組在一維數(shù)組中表明的位置分割')
b = numpy.split(a,[4,7])
print (b)
第一個(gè)數(shù)組
[0 1 2 3 4 5 6 7 8]
將數(shù)組分為三個(gè)大小相等的子數(shù)組
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
將數(shù)組在一維數(shù)組中表明的位置分割
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
[Finished in 0.1s]
numpy.hsplit
用于水平分割數(shù)組淫茵, 通過指定要返回的相同形狀的數(shù)組數(shù)量來拆分原數(shù)組
import numpy
harr = numpy.floor(10 * numpy.random.random((2,6)))
print ('原數(shù)組')
print (harr)
print ('拆分后')
print (numpy.hsplit(harr,3))
原數(shù)組
[[ 6. 3. 8. 0. 4. 8.]
[ 6. 6. 7. 0. 3. 1.]]
拆分后
[array([[ 6., 3.],
[ 6., 6.]]), array([[ 8., 0.],
[ 7., 0.]]), array([[ 4., 8.],
[ 3., 1.]])]
[Finished in 0.3s]
numpy.vsplit
沿垂直軸分割, 分割方式和hsplit相同
import numpy
a = numpy.arange(16).reshape(4,4)
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')
print ('豎直分割')
b = numpy.vsplit(a,2)
print (b)
第一個(gè)數(shù)組:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
豎直分割
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
[Finished in 0.1s]
數(shù)組元素的添加與刪除
函數(shù) | 元素及描述 |
---|---|
resize |
返回指定形狀的新數(shù)組 |
append |
將值添加到數(shù)組末尾 |
insert |
沿指定軸將值插入到指定下標(biāo)之前 |
delete |
刪掉某個(gè)軸的子數(shù)組,并返回刪除后的新數(shù)組 |
unique |
查找數(shù)組內(nèi)的唯一元素 |
numpy.resize
返回指定大小的新數(shù)組, 如果新數(shù)組大小大于原始大小, 則包含原數(shù)組中的元素副本
numpy.resize(arr, shape)
arr
要修改大小的數(shù)組
shape
返回?cái)?shù)組的新形狀
import numpy
a = numpy.array([[1,2,3],[4,5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('第一個(gè)數(shù)組形狀')
print (a.shape)
print ('\n')
b = numpy.resize(a,(3,2))
print ('第二個(gè)數(shù)組')
print (b)
print ('第二個(gè)數(shù)組形狀')
print (b.shape)
print ('\n')
# 注意a的第一行b中重復(fù)出現(xiàn), 因?yàn)槌叽缱兇罅?print ('修改后的第二個(gè)數(shù)組大小')
print (numpy.resize(a,(3,3)))
第一個(gè)數(shù)組
[[1 2 3]
[4 5 6]]
第一個(gè)數(shù)組形狀
(2, 3)
第二個(gè)數(shù)組
[[1 2]
[3 4]
[5 6]]
第二個(gè)數(shù)組形狀
(3, 2)
修改后的第二個(gè)數(shù)組大小
[[1 2 3]
[4 5 6]
[1 2 3]]
[Finished in 0.1s]
numpy.append
函數(shù)在數(shù)組末尾添加值, 追加操作會(huì)分配整個(gè)數(shù)組, 并把原來的數(shù)組復(fù)制到新數(shù)組里, 此外, 輸入數(shù)組的維度必須匹配否則將生成ValueError
append函數(shù)返回的始終是一個(gè)一維數(shù)組
numpy.append(arr, values, axis=None)
-
arr
:輸入數(shù)組 -
values
:要向arr
添加的值蹬跃,需要和arr
形狀相同(除了要添加的軸) -
axis
:默認(rèn)為 None匙瘪。當(dāng)axis無定義時(shí),是橫向加成蝶缀,返回總是為一維數(shù)組丹喻!當(dāng)axis有定義的時(shí)候,分別為0和1的時(shí)候翁都。當(dāng)axis有定義的時(shí)候碍论,分別為0和1的時(shí)候(列數(shù)要相同)。當(dāng)axis為1時(shí)柄慰,數(shù)組是加在右邊(行數(shù)要相同)鳍悠。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('向數(shù)組添加元素')
print (np.append(a, [7,8,9]))
print ('\n')
print ('沿軸0添加元素')
print (np.append(a, [[7,8,9]], axis = 0))
print ('\n')
print ('沿軸1添加元素')
print (np.append(a, [[5,5,5],[7,8,9]], axis = 1))
第一個(gè)數(shù)組
[[1 2 3]
[4 5 6]]
向數(shù)組添加元素
[1 2 3 4 5 6 7 8 9]
沿軸0添加元素
[[1 2 3]
[4 5 6]
[7 8 9]]
沿軸1添加元素
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
[Finished in 0.1s]
numpy.insert
在給定索引之前, 沿給定軸在輸入數(shù)組中插入值, 如果值的類型轉(zhuǎn)換為要插入, 則它與輸入數(shù)組不同, 插入沒有原地的, 函數(shù)會(huì)返回一個(gè)新數(shù)組, 此外未提供軸, 則輸入數(shù)組被展開.
numpy.insert(arr, obj, values, axis)
arr
輸入數(shù)組
obj
在其 之前插入值的索引
values
要插入的值
axis
沿著它插入的軸, 如果未提供, 則輸入數(shù)組會(huì)被展開
import numpy as np
a = np.array([[1,2], [3,4], [5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開')
print (np.insert(a,3,[11,22]))
print ('\n')
print ('傳遞axis參數(shù), 會(huì)廣播值數(shù)組來配輸入數(shù)組')
print ('沿軸0廣播')
print (np.insert(a, 1, [11], axis = 0))
print ('\n')
print ('沿軸1廣播')
print (np.insert(a,1,11,axis = 1))
第一個(gè)數(shù)組
[[1 2]
[3 4]
[5 6]]
未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開
[ 1 2 3 11 22 4 5 6]
傳遞axis參數(shù), 會(huì)廣播值數(shù)組來配輸入數(shù)組
沿軸0廣播
[[ 1 2]
[11 11]
[ 3 4]
[ 5 6]]
沿軸1廣播
[[ 1 11 2]
[ 3 11 4]
[ 5 11 6]]
numpy.delete
返回從輸入數(shù)組中刪除指定子數(shù)組的新數(shù)組, 與insert函數(shù)一樣, 如果未提供軸參數(shù), 輸入數(shù)組將展開
numpy.delete(arr, obj, axis)
arr
輸入數(shù)組
obj
可以被切片, 整數(shù)或者整數(shù)數(shù)組, 表明要從輸入數(shù)組刪除的子數(shù)組
axis
沿著它刪除給定子數(shù)組的軸, 如果未提供, 則輸入數(shù)組會(huì)被展開
import numpy as np
a = np.arange(12).reshape(3,4)
print (a)
print ('\n')
print ('未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開')
print (np.delete(a,5))
print ('刪除第二列')
print (np.delete(a,1,axis = 1))
print ('\n')
print ('包含從數(shù)組中刪除的替代值的切片')
a = np.array([1,2,3,4,5,6,7,8,9,10])
print (np.delete(a, np.s_[::2]))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開
[ 0 1 2 3 4 6 7 8 9 10 11]
刪除第二列
[[ 0 2 3]
[ 4 6 7]
[ 8 10 11]]
包含從數(shù)組中刪除的替代值的切片
[ 2 4 6 8 10]
numpy.unique
用于去除數(shù)組中的重復(fù)元素
numpy.unique(arr, return_index, return_inverse, return_counts)
arr
輸入數(shù)組, 如果不是一維數(shù)組則會(huì)展開
return_index
如果為true, 返回新列表元素在舊列表中的位置(下表), 并以列表形式存儲(chǔ)
return_inverse
如果為true, 返回舊列表元素在新列表中的位置(下標(biāo)), 并以列表形式存儲(chǔ)
return_counts
如果為true, 返回去重?cái)?shù)組中的元素在原數(shù)組中出現(xiàn)次數(shù)
import numpy as np
a = np.array([5,2,6,2,7,5,6,8,2,9])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('第一個(gè)數(shù)組的去重值')
u = np.unique(a)
print (u)
print ('\n')
print ('去重?cái)?shù)組的索引數(shù)組')
u, indices = np.unique(a, return_index = True)
print (indices)
print ('\n')
print ('我們可以看到每個(gè)和原數(shù)組下表對(duì)應(yīng)的數(shù)值')
print (a)
print ('\n')
print ('去重?cái)?shù)組的下標(biāo)')
u, indices = np.unique(a, return_inverse = True)
print (u)
print ('\n')
print ('下標(biāo)為')
print (indices)
print ('\n')
print ('使用下標(biāo)重構(gòu)原數(shù)組')
print (u[indices])
print ('\n')
print ('返回去重元素的重復(fù)數(shù)量')
u, indices = np.unique(a, return_counts = True)
print (u)
print (indices)
第一個(gè)數(shù)組
[5 2 6 2 7 5 6 8 2 9]
第一個(gè)數(shù)組的去重值
[2 5 6 7 8 9]
去重?cái)?shù)組的索引數(shù)組
[1 0 2 4 7 9]
我們可以看到每個(gè)和原數(shù)組下表對(duì)應(yīng)的數(shù)值
[5 2 6 2 7 5 6 8 2 9]
去重?cái)?shù)組的下標(biāo)
[2 5 6 7 8 9]
下標(biāo)為
[1 0 2 0 3 1 2 4 0 5]
使用下標(biāo)重構(gòu)原數(shù)組
[5 2 6 2 7 5 6 8 2 9]
返回去重元素的重復(fù)數(shù)量
[2 5 6 7 8 9]
[3 2 2 1 1 1]
numpy 位運(yùn)算
NumPy "bitwise_" 開頭的函數(shù)是位運(yùn)算函數(shù)税娜。
NumPy 位運(yùn)算包括以下幾個(gè)函數(shù):
函數(shù) | 描述 |
---|---|
bitwise_and |
對(duì)數(shù)組元素執(zhí)行位與操作 |
bitwise_or |
對(duì)數(shù)組元素執(zhí)行位或操作 |
invert |
按位取反 |
left_shift |
向左移動(dòng)二進(jìn)制表示的位 |
right_shift |
向右移動(dòng)二進(jìn)制表示的位 |
注:也可以使用 "&"、 "~"藏研、 "|" 和 "^" 等操作符進(jìn)行計(jì)算敬矩。
import numpy as np
print ('13和17二進(jìn)制形式')
a,b = 13, 17
print (bin(a), bin(b))
print ('\n')
print ('13和17的位與')
print (np.bitwise_and(13,17))
13和17二進(jìn)制形式
0b1101 0b10001
13和17的位與
1
以上實(shí)例可以用下表來說明:
1 | 1 | 0 | 1 | ||
---|---|---|---|---|---|
AND | |||||
1 | 0 | 0 | 0 | 1 | |
運(yùn)算結(jié)果 | 0 | 0 | 0 | 0 | 1 |
位與操作運(yùn)算規(guī)律如下:
A | B | AND |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
bitwise_or
對(duì)數(shù)組中整數(shù)的二進(jìn)制形式執(zhí)行位或運(yùn)算
import numpy as np
a, b = 13, 17
print ('13和17的二進(jìn)制形式')
print (bin(a), bin(b))
print ('13和17的位或')
print (np.bitwise_or(13,17))
13和17的二進(jìn)制形式
0b1101 0b10001
13和17的位或
29
以上實(shí)例可以用下表來說明:
1 | 1 | 0 | 1 | ||
---|---|---|---|---|---|
OR | |||||
1 | 0 | 0 | 0 | 1 | |
運(yùn)算結(jié)果 | 1 | 1 | 1 | 0 | 1 |
位或操作運(yùn)算規(guī)律如下:
A | B | OR |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
invert
函數(shù)對(duì)數(shù)組中整數(shù)進(jìn)行取反運(yùn)算, 0變?yōu)?, 1變?yōu)?
對(duì)于有符號(hào)的整數(shù), 取該二進(jìn)制的補(bǔ)碼然后+1 二進(jìn)制數(shù), 最高位為0表示整數(shù), 最高位為1 表示負(fù)數(shù)
看看 ~1 的計(jì)算步驟:
將1(這里叫:原碼)轉(zhuǎn)二進(jìn)制 = 00000001
按位取反 = 11111110
發(fā)現(xiàn)符號(hào)位(即最高位)為1(表示負(fù)數(shù)),將除符號(hào)位之外的其他數(shù)字取反 = 10000001
末位加1取其補(bǔ)碼 = 10000010
轉(zhuǎn)換回十進(jìn)制 = -2
-
表達(dá)式 二進(jìn)制值(2 的補(bǔ)數(shù)) 十進(jìn)制值 5 00000000 00000000 00000000 0000010 5 ~5 11111111 11111111 11111111 11111010 -6
import numpy as np
print ('13的位反轉(zhuǎn),其中ndarra的dtype是uint8')
print (np.invert(np.array([13], dtype = np.uint8)))
print ('\n')
# 比較13和242的二進(jìn)制數(shù)表示, 我們發(fā)現(xiàn)了位的反轉(zhuǎn)
print ('13的二進(jìn)制表示:')
print (np.binary_repr(13, width = 8))
print ('\n')
print ('242的二進(jìn)制表示')
print (np.binary_repr(242, width = 8))
13的位反轉(zhuǎn),其中ndarra的dtype是uint8
[242]
13的二進(jìn)制表示:
00001101
242的二進(jìn)制表示
11110010
left_shift
將數(shù)組元素的二進(jìn)制形式向左移動(dòng)到指定位置, 右側(cè)附加相等數(shù)量的0
import numpy as np
print ('將10向左移動(dòng)兩位')
print (np.left_shift(10,2))
print ('\n')
print ('10的二進(jìn)制表示')
print (np.binary_repr(10, width = 8))
print ('40的二進(jìn)制表示')
print (np.binary_repr(40, width = 8))
# '00001010'中的兩位移動(dòng)到左邊, 并在右邊添加了兩個(gè)0
將10向左移動(dòng)兩位
40
10的二進(jìn)制表示
00001010
40的二進(jìn)制表示
00101000
right_shift
函數(shù)將數(shù)組元素的二進(jìn)制形式向右移動(dòng)到指定的位置, 左側(cè)附加相等數(shù)量的0
import numpy as np
print ('將40右移兩位')
print (np.right_shift(40,2))
print ('\n')
print ('40的二進(jìn)制表示')
print (np.binary_repr(40, width = 8))
print ('\n')
print ('10的二進(jìn)制表示')
print (np.binary_repr(10, width = 8))
# '00001010'中的兩位移動(dòng)到了右邊, 并在左邊添加了兩個(gè)0
將40右移兩位
10
40的二進(jìn)制表示
00101000
10的二進(jìn)制表示
00001010
numpy字符串函數(shù)
以下函數(shù)用于對(duì) dtype 為 numpy.string_ 或 numpy.unicode_ 的數(shù)組執(zhí)行向量化字符串操作蠢挡。 它們基于 Python 內(nèi)置庫中的標(biāo)準(zhǔn)字符串函數(shù)弧岳。
這些函數(shù)在字符數(shù)組類(numpy.char)中定義。
函數(shù) | 描述 |
---|---|
add() |
對(duì)兩個(gè)數(shù)組的逐個(gè)字符串元素進(jìn)行連接 |
multiply() | 返回按元素多重連接后的字符串 |
center() |
居中字符串 |
capitalize() |
將字符串第一個(gè)字母轉(zhuǎn)換為大寫 |
title() |
將字符串的每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換為大寫 |
lower() |
數(shù)組元素轉(zhuǎn)換為小寫 |
upper() |
數(shù)組元素轉(zhuǎn)換為大寫 |
split() |
指定分隔符對(duì)字符串進(jìn)行分割业踏,并返回?cái)?shù)組列表 |
splitlines() |
返回元素中的行列表缩筛,以換行符分割 |
strip() |
移除元素開頭或者結(jié)尾處的特定字符 |
join() |
通過指定分隔符來連接數(shù)組中的元素 |
replace() |
使用新字符串替換字符串中的所有子字符串 |
decode() |
數(shù)組元素依次調(diào)用str.decode
|
encode() |
數(shù)組元素依次調(diào)用str.encode
|
numpy.char.add()
依次對(duì)兩個(gè)數(shù)組的元素進(jìn)行字符串連接
import numpy as np
print ('連接兩個(gè)字符串')
print (np.char.add(['hello'],['word']))
print ('連接示列')
print (np.char.add(['hello', 'hi'],['word','world']))
連接兩個(gè)字符串
['helloword']
連接示列
['helloword' 'hiworld']
numpy.char.multiply()
執(zhí)行多重連接
import numpy as np
print (np.char.multiply('python', 5))
pythonpythonpythonpythonpython
numpy.char.center()
函數(shù)用于將字符串居中, 并使用指定字符在左側(cè)和右側(cè)進(jìn)行填充
np.char.center(str, width, fillchar)
str: 字符串, width:長(zhǎng)度, fillchar: 填充字符
import numpy as np
print (np.char.center('python', 20, fillchar = '*'))
*******python*******
numpy.char.capitalize()
將字符串的第一個(gè)字母裝換為大寫
>>> import numpy as np
>>> print (np.char.capitalize('python')
... )
Python
numpy.char.title()
字符串的每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換為大寫
>>> import numpy as np
>>> print (np.char.title('i love python'))
I Love Python
numpy.char.lower()
對(duì)數(shù)組的每個(gè)元素轉(zhuǎn)換為小寫, 對(duì)每個(gè)元素調(diào)用str.lower
>>> print (np.char.lower(['HELLO','PYTHON'])) # 操作數(shù)組
['hello' 'python']
>>> print (np.char.lower('PYTHON')) # 操作字符串
python
numpy.char.upper()
將數(shù)組每個(gè)元素轉(zhuǎn)換成大寫, 同char.lower()
numpy.char.split()
通過指定分隔符對(duì)字符串進(jìn)行分割,并返回?cái)?shù)組堡称。默認(rèn)情況下瞎抛,分隔符為空格。
>>> print (np.char.split('i love python')) # 默認(rèn)分割符為空格
['i', 'love', 'python']
>>> print (np.char.split('pigdaqiang.top', sep = '.')) # 指定分隔符為 .
['pigdaqiang', 'top']
numpy.char.splitlines()
以換行符作為分隔符, 并返回?cái)?shù)組
>>> print (np.char.splitlines('i\r\nlove python'))
['i', 'love python']
>>> print (np.char.splitlines('i\rlove python'))
['i', 'love python']
注意區(qū)別linux下和win下?lián)Q行符的區(qū)別 \r
\n
\r\n
numpy.char.strip()
用于移除開頭或結(jié)尾處的特定字符
>>> print (np.char.strip('hhello', 'h')) # 移除字符串頭尾的h字符
ello
>>>
>>> print (np.char.strip(['hello','hi','high'],'h')) # 移除數(shù)組元素頭尾的a字符
['ello' 'i' 'ig']
>>>
numpy.char.join()
通過指定分割符來連接數(shù)組中的元素或字符串
>>> print (np.char.join(':','hello'))
h:e:l:l:o
>>> print (np.char.join([':','*'],['hello','python']))
['h:e:l:l:o' 'p*y*t*h*o*n']
>>>
numpy.char.replace()
使用新字符串代替字符串中的所有子字符串
>>> print (np.char.replace('i love python',' ','*'))
i*love*python
>>>
numpy.char.encode()
函數(shù)對(duì)數(shù)組中的每個(gè)元素調(diào)用str.encode函數(shù), 默認(rèn)編碼是utf-8, 可以使用標(biāo)準(zhǔn)python庫中的編解碼器
>>> print (np.char.encode('hello','cp500'))
b'\x88\x85\x93\x93\x96'
>>>
numpy.char.decode()
函數(shù)對(duì)編碼的元素進(jìn)行str.encode()解碼
>>> a = np.char.encode('hello', 'cp500')
>>> print (a, np.char.decode(a, 'cp500'))
b'\x88\x85\x93\x93\x96' hello
>>>
numpy數(shù)學(xué)函數(shù)
NumPy 包含大量的各種數(shù)學(xué)運(yùn)算的函數(shù)却紧,包括三角函數(shù)桐臊,算術(shù)運(yùn)算的函數(shù),復(fù)數(shù)處理函數(shù)等晓殊。
三角函數(shù)
NumPy 提供了標(biāo)準(zhǔn)的三角函數(shù):sin()断凶、cos()、tan()巫俺。
import numpy as np
a = np.array([0,20,45,60,90])
print ('不同角度的正弦值')
# 通過乘pi/180轉(zhuǎn)化為弧度
print (np.sin(a*np.pi/180))
print ('\n')
print ('數(shù)組中角度的余玄值')
print (np.cos(a*np.pi/180))
print ('\n')
print ('數(shù)組中角度的正切值')
print (np.tan(a*np.pi/180))
不同角度的正弦值
[ 0. 0.34202014 0.70710678 0.8660254 1. ]
數(shù)組中角度的余玄值
[ 1.00000000e+00 9.39692621e-01 7.07106781e-01 5.00000000e-01
6.12323400e-17]
數(shù)組中角度的正切值
[ 0.00000000e+00 3.63970234e-01 1.00000000e+00 1.73205081e+00
1.63312394e+16]
arcsin认烁,arccos,和 arctan 函數(shù)返回給定角度的 sin介汹,cos 和 tan 的反三角函數(shù)却嗡。
這些函數(shù)的結(jié)果可以通過 numpy.degrees() 函數(shù)將弧度轉(zhuǎn)換為角度。
import numpy as np
a = np.array([0,30,45,60,90])
print ('含有正弦值的數(shù)組:')
sin = np.sin(a*np.pi/180)
print (sin)
print ('\n')
print ('計(jì)算角度的反正弦嘹承,返回值以弧度為單位:')
inv = np.arcsin(sin)
print (inv)
print ('\n')
print ('通過轉(zhuǎn)化為角度制來檢查結(jié)果:')
print (np.degrees(inv))
print ('\n')
print ('arccos 和 arctan 函數(shù)行為類似:')
cos = np.cos(a*np.pi/180)
print (cos)
print ('\n')
print ('反余弦:')
inv = np.arccos(cos)
print (inv)
print ('\n')
print ('角度制單位:')
print (np.degrees(inv))
print ('\n')
print ('tan 函數(shù):')
tan = np.tan(a*np.pi/180)
print (tan)
print ('\n')
print ('反正切:')
inv = np.arctan(tan)
print (inv)
print ('\n')
print ('角度制單位:')
print (np.degrees(inv))
含有正弦值的數(shù)組:
[0. 0.5 0.70710678 0.8660254 1. ]
計(jì)算角度的反正弦窗价,返回值以弧度為單位:
[0. 0.52359878 0.78539816 1.04719755 1.57079633]
通過轉(zhuǎn)化為角度制來檢查結(jié)果:
[ 0. 30. 45. 60. 90.]
arccos 和 arctan 函數(shù)行為類似:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
6.12323400e-17]
反余弦:
[0. 0.52359878 0.78539816 1.04719755 1.57079633]
角度制單位:
[ 0. 30. 45. 60. 90.]
tan 函數(shù):
[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
1.63312394e+16]
反正切:
[0. 0.52359878 0.78539816 1.04719755 1.57079633]
角度制單位:
[ 0. 30. 45. 60. 90.]
舍入函數(shù)
函數(shù)返回指定數(shù)字的四舍五入值
numpy.around(a, decimals)
a
數(shù)組
decimals
舍入的小數(shù)位數(shù), 默認(rèn)值為0, 如果為負(fù)數(shù), 整數(shù)將四舍五入到小數(shù)點(diǎn)的左側(cè)
import numpy as np
a = np.array([1.0, 5.55, 123, 0.567, 25.532])
print ('原數(shù)組')
print (a)
print ('\n')
print ('舍入后')
print (np.around(a))
print (np.around(a, decimals = 1))
print (np.around(a, decimals = -1))
原數(shù)組
[ 1. 5.55 123. 0.567 25.532]
舍入后
[ 1. 6. 123. 1. 26.]
[ 1. 5.6 123. 0.6 25.5]
[ 0. 10. 120. 0. 30.]
numpy.floor()
返回小于或者等于指定表達(dá)式的最大整數(shù), 向下取整
import numpy as np
a = np.array([-1.7, 1.5, -0.2, 0.6, 10])
print ('提供的數(shù)組')
print (a)
print ('\n')
print ('修改后的數(shù)組')
print (np.floor(a))
提供的數(shù)組
[ -1.7 1.5 -0.2 0.6 10. ]
修改后的數(shù)組
[ -2. 1. -1. 0. 10.]
numpy.ceil()
返回大于或者等于指定表達(dá)式的最小整數(shù), 即向上取整. 用法同floor
numpy算術(shù)函數(shù)
算術(shù)函數(shù)包含簡(jiǎn)單的加減乘除:add(), substract(), multiply(), divide()
數(shù)組必須具有相同形狀或符合數(shù)組廣播 規(guī)則
import numpy as np
a = np.arange(9, dtype = np.float_).reshape(3,3)
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('第二個(gè)數(shù)組')
b = np.array([10,10,10])
print (b)
print ('\n')
print ('兩個(gè)數(shù)組相加')
print (np.add(a,b))
print ('\n')
print ('兩個(gè)數(shù)組相減')
print (np.subtract(a,b))
print ('\n')
print ('兩個(gè)數(shù)組相乘')
print (np.multiply(a,b))
print ('\n')
print ('兩個(gè)數(shù)組 相除:')
print (np.divide(a,b))
第一個(gè)數(shù)組
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]
第二個(gè)數(shù)組
[10 10 10]
兩個(gè)數(shù)組相加
[[ 10. 11. 12.]
[ 13. 14. 15.]
[ 16. 17. 18.]]
兩個(gè)數(shù)組相減
[[-10. -9. -8.]
[ -7. -6. -5.]
[ -4. -3. -2.]]
兩個(gè)數(shù)組相乘
[[ 0. 10. 20.]
[ 30. 40. 50.]
[ 60. 70. 80.]]
兩個(gè)數(shù)組 相除:
[[ 0. 0.1 0.2]
[ 0.3 0.4 0.5]
[ 0.6 0.7 0.8]]
numpy.reciprocal()
返回參數(shù)逐元素的倒數(shù), 1/4倒數(shù)4/1
import numpy as np
a = np.array([0.25, 1.33, 1, 100])
print (a)
print ('倒數(shù)')
print (np.reciprocal(a))
[ 0.25 1.33 1. 100. ]
倒數(shù)
[ 4. 0.7518797 1. 0.01 ]
numpy.power()
函數(shù)將第一個(gè)輸入數(shù)組中的元素作為底數(shù), 計(jì)算它與第二個(gè)輸入數(shù)組中相應(yīng)元素的冪
import numpy as np
a = np.array([10,100,1000])
print ('數(shù)組')
print (a)
print ('\n')
print ('調(diào)用power')
print (np.power(a,2))
print ('\n')
print ('第二個(gè)數(shù)組')
b = np.array([1,2,3])
print (b)
print ('再次調(diào)用power函數(shù)')
print (np.power(a,b))
數(shù)組
[ 10 100 1000]
調(diào)用power
[ 100 10000 1000000]
第二個(gè)數(shù)組
[1 2 3]
再次調(diào)用power函數(shù)
[ 10 10000 1000000000]
numpy.mod()
計(jì)算輸入數(shù)組中相應(yīng)元素的相除后的余數(shù), numpy.remainder()也產(chǎn)生相同的結(jié)果
import numpy as np
a = np.array([10,20,30])
b = np.array([3,5,7])
print ('調(diào)用mod')
print (np.mod(a,b))
print ('調(diào)用remainder')
print (np.remainder(a,b))
調(diào)用mod
[1 0 2]
調(diào)用remainder
[1 0 2]
參考教程:菜鳥教程
個(gè)人博客
numpy學(xué)習(xí)(二)
?