最全的NumPy教程
譯者:飛龍
譯文:https://www.jianshu.com/p/57e3c0a92f3a
原文:https://www.tutorialspoint.com/numpy/index.htm
NumPy - 簡介
NumPy 是一個 Python 包。它代表 “Numeric Python”。它是一個由多維數(shù)組對象和用于處理數(shù)組的例程集合組成的庫。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 開發(fā)的。也開發(fā)了另一個包 Numarray ,它擁有一些額外的功能。2005年,Travis Oliphant 通過將 Numarray 的功能集成到 Numeric 包中來創(chuàng)建 NumPy 包。這個開源項目有很多貢獻者。
NumPy 操作
使用NumPy,開發(fā)人員可以執(zhí)行以下操作:
數(shù)組的算數(shù)和邏輯運算。
傅立葉變換和用于圖形操作的例程。
與線性代數(shù)有關(guān)的操作。NumPy 擁有線性代數(shù)和隨機數(shù)生成的內(nèi)置函數(shù)。
NumPy – MatLab 的替代之一
NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用。這種組合廣泛用于替代 MatLab,是一個流行的技術(shù)計算平臺。但是,Python 作為 MatLab 的替代方案,現(xiàn)在被視為一種更加現(xiàn)代和完整的編程語言。
NumPy 是開源的,這是它的一個額外的優(yōu)勢。
NumPy - 環(huán)境
在線嘗試
我們已經(jīng)在線設(shè)置了 NumPy 編程環(huán)境,以便在線編譯和執(zhí)行所有可用的示例。它向你提供了信心,并使您能夠使用不同的選項驗證程序, 隨意修改任何示例并在線執(zhí)行。
使用我們的在線編譯器嘗試一下示例,它位于 CodingGround
https://www.tutorialspoint.com/codingground.htm
import numpy as np
a = 'hello world'
print a對于本教程中給出的大多數(shù)示例,你會在我們的網(wǎng)站代碼部分的右上角找到一個
Try it選項,這會把你帶到在線編譯器。所以快來使用它,享受你的學(xué)習(xí)吧。
標(biāo)準(zhǔn)的 Python 發(fā)行版不會與 NumPy 模塊捆綁在一起。一個輕量級的替代方法是使用流行的 Python 包安裝程序 pip 來安裝 NumPy。
pip install numpy
啟用 NumPy 的最佳方法是使用特定于您的操作系統(tǒng)的可安裝的二進制包。這些二進制包含完整的 SciPy 技術(shù)棧(包括 NumPy,SciPy,matplotlib,IPython,SymPy 以及 Python 核心自帶的其它包)。
NumPy - Ndarray 對象
NumPy 中定義的最重要的對象是稱為 ndarray 的 N 維數(shù)組類型。它描述相同類型的元素集合。可以使用基于零的索引訪問集合中的項目。
ndarray中的每個元素在內(nèi)存中使用相同大小的塊。 ndarray中的每個元素是數(shù)據(jù)類型對象的對象(稱為 dtype)。
從ndarray對象提取的任何元素(通過切片)由一個數(shù)組標(biāo)量類型的 Python 對象表示。下圖顯示了ndarray,數(shù)據(jù)類型對象(dtype)和數(shù)組標(biāo)量類型之間的關(guān)系。

ndarray類的實例可以通過本教程后面描述的不同的數(shù)組創(chuàng)建例程來構(gòu)造。基本的ndarray是使用 NumPy 中的數(shù)組函數(shù)創(chuàng)建的,如下所示:
numpy.array
它從任何暴露數(shù)組接口的對象,或從返回數(shù)組的任何方法創(chuàng)建一個ndarray。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的構(gòu)造器接受以下參數(shù):
| 序號 | 參數(shù)及描述 |
|---|---|
| 1. | object 任何暴露數(shù)組接口方法的對象都會返回一個數(shù)組或任何(嵌套)序列。 |
| 2. | dtype 數(shù)組的所需數(shù)據(jù)類型,可選。 |
| 3. | copy 可選,默認(rèn)為true,對象是否被復(fù)制。 |
| 4. | order C(按行)、F(按列)或A(任意,默認(rèn))。 |
| 5. | subok 默認(rèn)情況下,返回的數(shù)組被強制為基類數(shù)組。如果為true,則返回子類。 |
| 6. | ndimin 指定返回數(shù)組的最小維數(shù)。 |
看看下面的例子來更好地理解。
示例 1
import numpy as np
a = np.array([1,2,3])
print a
輸出如下:
[1, 2, 3]
示例 2
# 多于一個維度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print a
輸出如下:
[[1, 2]
[3, 4]]
示例 3
# 最小維度
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print a
輸出如下:
[[1, 2, 3, 4, 5]]
示例 4
# dtype 參數(shù)
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print a
輸出如下:
[ 1.+0.j, 2.+0.j, 3.+0.j]
NumPy - 數(shù)據(jù)類型
NumPy 支持比 Python 更多種類的數(shù)值類型。下表顯示了 NumPy 中定義的不同標(biāo)量數(shù)據(jù)類型。
| 序號 | 數(shù)據(jù)類型及描述 |
|---|---|
| 1. | bool_ 存儲為一個字節(jié)的布爾值(真或假) |
| 2. | int_ 默認(rèn)整數(shù),相當(dāng)于 C 的long,通常為int32或int64 |
| 3. | intc 相當(dāng)于 C 的int,通常為int32或int64 |
| 4. | intp 用于索引的整數(shù),相當(dāng)于 C 的size_t,通常為int32或int64 |
| 5. | int8 字節(jié)(-128 ~ 127) |
| 6. | int16 16 位整數(shù)(-32768 ~ 32767) |
| 7. | int32 32 位整數(shù)(-2147483648 ~ 2147483647) |
| 8. | int64 64 位整數(shù)(-9223372036854775808 ~ 9223372036854775807) |
| 9. | uint8 8 位無符號整數(shù)(0 ~ 255) |
| 10. | uint16 16 位無符號整數(shù)(0 ~ 65535) |
| 11. | uint32 32 位無符號整數(shù)(0 ~ 4294967295) |
| 12. | uint64 64 位無符號整數(shù)(0 ~ 18446744073709551615) |
| 13. | float_ float64的簡寫 |
| 14. | float16 半精度浮點:符號位,5 位指數(shù),10 位尾數(shù) |
| 15. | float32 單精度浮點:符號位,8 位指數(shù),23 位尾數(shù) |
| 16. | float64 雙精度浮點:符號位,11 位指數(shù),52 位尾數(shù) |
| 17. | complex_ complex128的簡寫 |
| 18. | complex64 復(fù)數(shù),由兩個 32 位浮點表示(實部和虛部) |
| 19. | complex128 復(fù)數(shù),由兩個 64 位浮點表示(實部和虛部) |
NumPy 數(shù)字類型是dtype(數(shù)據(jù)類型)對象的實例,每個對象具有唯一的特征。這些類型可以是np.bool_,np.float32等。
數(shù)據(jù)類型對象 (dtype)
數(shù)據(jù)類型對象描述了對應(yīng)于數(shù)組的固定內(nèi)存塊的解釋,取決于以下方面:
數(shù)據(jù)類型(整數(shù)、浮點或者 Python 對象)
數(shù)據(jù)大小
字節(jié)序(小端或大端)
在結(jié)構(gòu)化類型的情況下,字段的名稱,每個字段的數(shù)據(jù)類型,和每個字段占用的內(nèi)存塊部分。
如果數(shù)據(jù)類型是子序列,它的形狀和數(shù)據(jù)類型。
字節(jié)順序取決于數(shù)據(jù)類型的前綴<或>。 <意味著編碼是小端(最小有效字節(jié)存儲在最小地址中)。 >意味著編碼是大端(最大有效字節(jié)存儲在最小地址中)。
dtype可由一下語法構(gòu)造:
numpy.dtype(object, align, copy)
參數(shù)為:
Object:被轉(zhuǎn)換為數(shù)據(jù)類型的對象。Align:如果為true,則向字段添加間隔,使其類似 C 的結(jié)構(gòu)體。Copy:生成dtype對象的新副本,如果為flase,結(jié)果是內(nèi)建數(shù)據(jù)類型對象的引用。
示例 1
# 使用數(shù)組標(biāo)量類型
import numpy as np
dt = np.dtype(np.int32)
print dt
輸出如下:
int32
示例 2
#int8,int16,int32,int64 可替換為等價的字符串 'i1','i2','i4',以及其他。
import numpy as np
dt = np.dtype('i4')
print dt
輸出如下:
int32
示例 3
# 使用端記號
import numpy as np
dt = np.dtype('>i4')
print dt
輸出如下:
>i4
下面的例子展示了結(jié)構(gòu)化數(shù)據(jù)類型的使用。這里聲明了字段名稱和相應(yīng)的標(biāo)量數(shù)據(jù)類型。
示例 4
# 首先創(chuàng)建結(jié)構(gòu)化數(shù)據(jù)類型。
import numpy as np
dt = np.dtype([('age',np.int8)])
print dt
輸出如下:
[('age', 'i1')]
示例 5
# 現(xiàn)在將其應(yīng)用于 ndarray 對象
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a
輸出如下:
[(10,) (20,) (30,)]
示例 6
# 文件名稱可用于訪問 age 列的內(nèi)容
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a['age']
輸出如下:
[10 20 30]
示例 7
以下示例定義名為 student 的結(jié)構(gòu)化數(shù)據(jù)類型,其中包含字符串字段name,整數(shù)字段age和浮點字段marks。此dtype應(yīng)用于ndarray對象。
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print student
輸出如下:
[('name', 'S20'), ('age', 'i1'), ('marks', '
)]
示例 8
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print a
輸出如下:
[('abc', 21, 50.0), ('xyz', 18, 75.0)]
每個內(nèi)建類型都有一個唯一定義它的字符代碼:
'b':布爾值'i':符號整數(shù)'u':無符號整數(shù)'f':浮點'c':復(fù)數(shù)浮點'm':時間間隔'M':日期時間'O':Python 對象'S', 'a':字節(jié)串'U':Unicode'V':原始數(shù)據(jù)(void)
NumPy - 數(shù)組屬性
這一章中,我們會討論 NumPy 的多種數(shù)組屬性。
ndarray.shape
這一數(shù)組屬性返回一個包含數(shù)組維度的元組,它也可以用于調(diào)整數(shù)組大小。
示例 1
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a.shape
輸出如下:
(2, 3)
示例 2
NumPy 也提供了reshape函數(shù)來調(diào)整數(shù)組大小。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print b
輸出如下:
[[1, 2]
[3, 4]
[5, 6]]
NumPy - 切片和索引
ndarray對象的內(nèi)容可以通過索引或切片來訪問和修改,就像 Python 的內(nèi)置容器對象一樣。
如前所述,ndarray對象中的元素遵循基于零的索引。有三種可用的索引方法類型:字段訪問,基本切片和高級索引。
基本切片是 Python 中基本切片概念到 n 維的擴展。通過將start,stop和step參數(shù)提供給內(nèi)置的slice函數(shù)來構(gòu)造一個 Python slice對象。此slice對象被傳遞給數(shù)組來提取數(shù)組的一部分。
示例 1
import numpy as np
a = np.arange(10)
s = slice(2,7,2)
print a[s]
輸出如下:
[2 4 6]
在上面的例子中,ndarray對象由arange()函數(shù)創(chuàng)建。然后,分別用起始,終止和步長值2,7和2定義切片對象。當(dāng)這個切片對象傳遞給ndarray時,會對它的一部分進行切片,從索引2到7,步長為2。
通過將由冒號分隔的切片參數(shù)(start:stop:step)直接提供給ndarray對象,也可以獲得相同的結(jié)果。
示例 2
import numpy as np
a = np.arange(10)
b = a[2:7:2]
print b
輸出如下:
[2 4 6]
如果只輸入一個參數(shù),則將返回與索引對應(yīng)的單個項目。如果使用a:,則從該索引向后的所有項目將被提取。如果使用兩個參數(shù)(以:分隔),則對兩個索引(不包括停止索引)之間的元素以默認(rèn)步驟進行切片。
NumPy - 高級索引
如果一個ndarray是非元組序列,數(shù)據(jù)類型為整數(shù)或布爾值的ndarray,或者至少一個元素為序列對象的元組,我們就能夠用它來索引ndarray。高級索引始終返回數(shù)據(jù)的副本。與此相反,切片只提供了一個視圖。
有兩種類型的高級索引:整數(shù)和布爾值。
整數(shù)索引
這種機制有助于基于 N 維索引來獲取數(shù)組中任意元素。每個整數(shù)數(shù)組表示該維度的下標(biāo)值。當(dāng)索引的元素個數(shù)就是目標(biāo)ndarray的維度時,會變得相當(dāng)直接。
以下示例獲取了ndarray對象中每一行指定列的一個元素。因此,行索引包含所有行號,列索引指定要選擇的元素。
示例
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'
# 切片
z = x[1:4,1:3]
print '切片之后,我們的數(shù)組變?yōu)椋?
print z
print '\n'
# 對列使用高級索引
y = x[1:4,[1,2]]
print '對列使用高級索引來切片:'
print y
輸出如下:
我們的數(shù)組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
切片之后,我們的數(shù)組變?yōu)椋?br>[[ 4 5]
[ 7 8]
[10 11]]
對列使用高級索引來切片:
[[ 4 5]
[ 7 8]
[10 11]]
布爾索引
當(dāng)結(jié)果對象是布爾運算(例如比較運算符)的結(jié)果時,將使用此類型的高級索引。
示例
這個例子中,大于 5 的元素會作為布爾索引的結(jié)果返回。
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)在我們會打印出大于 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]
NumPy - 廣播
術(shù)語廣播是指 NumPy 在算術(shù)運算期間處理不同形狀的數(shù)組的能力。對數(shù)組的算術(shù)運算通常在相應(yīng)的元素上進行。如果兩個陣列具有完全相同的形狀,則這些操作被無縫執(zhí)行。
示例
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print c
輸出如下:
[10 40 90 160]
如果兩個數(shù)組的維數(shù)不相同,則元素到元素的操作是不可能的。然而,在 NumPy 中仍然可以對形狀不相似的數(shù)組進行操作,因為它擁有廣播功能。較小的數(shù)組會廣播到較大數(shù)組的大小,以便使它們的形狀可兼容。
如果滿足以下規(guī)則,可以進行廣播:
ndim較小的數(shù)組會在前面追加一個長度為 1 的維度。輸出數(shù)組的每個維度的大小是輸入數(shù)組該維度大小的最大值。
如果輸入在每個維度中的大小與輸出大小匹配,或其值正好為 1,則在計算中可它。
如果輸入的某個維度大小為 1,則該維度中的第一個數(shù)據(jù)元素將用于該維度的所有計算。
如果上述規(guī)則產(chǎn)生有效結(jié)果,并且滿足以下條件之一,那么數(shù)組被稱為可廣播的。
數(shù)組擁有相同形狀。
數(shù)組擁有相同的維數(shù),每個維度擁有相同長度,或者長度為 1。
數(shù)組擁有極少的維度,可以在其前面追加長度為 1 的維度,使上述條件成立。
NumPy - 數(shù)組上的迭代
NumPy 包包含一個迭代器對象numpy.nditer。它是一個有效的多維迭代器對象,可以用于在數(shù)組上進行迭代。數(shù)組的每個元素可使用 Python 的標(biāo)準(zhǔn)Iterator接口來訪問。
讓我們使用arange()函數(shù)創(chuàng)建一個 3X4 數(shù)組,并使用nditer對它進行迭代。
示例
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始數(shù)組是:'
print a print '\n'
print '修改后的數(shù)組是:'
for x in np.nditer(a):
print x,
輸出如下:
原始數(shù)組是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
修改后的數(shù)組是:
0 5 10 15 20 25 30 35 40 45 50 55
NumPy - 數(shù)組操作
NumPy包中有幾個例程用于處理ndarray對象中的元素。它們可以分為以下類型:
修改形狀
| 序號 | 形狀及描述 |
|---|---|
| 1. | reshape 不改變數(shù)據(jù)的條件下修改形狀 |
| 2. | flat 數(shù)組上的一維迭代器 |
| 3. | flatten 返回折疊為一維的數(shù)組副本 |
| 4. | ravel 返回連續(xù)的展開數(shù)組 |
numpy.reshape
這個函數(shù)在不改變數(shù)據(jù)的條件下修改形狀,它接受如下參數(shù):
numpy.reshape(arr, newshape, order)
其中:
arr:要修改形狀的數(shù)組newshape:整數(shù)或者整數(shù)數(shù)組,新的形狀應(yīng)當(dāng)兼容原有形狀-
order:'C'為 C 風(fēng)格順序,'F'為 F 風(fēng)格順序,'A'為保留原順序。
例子
import numpy as np
a = np.arange(8)
print '原始數(shù)組:'
print a
print '\n'
b = a.reshape(4,2)
print '修改后的數(shù)組:'
print b
輸出如下:
原始數(shù)組:
[0 1 2 3 4 5 6 7]
修改后的數(shù)組:
[[0 1]
[2 3]
[4 5]
[6 7]]
numpy.ndarray.flat
該函數(shù)返回數(shù)組上的一維迭代器,行為類似 Python 內(nèi)建的迭代器。
例子
import numpy as np
a = np.arange(8).reshape(2,4)
print '原始數(shù)組:'
print a
print '\n'
print '調(diào)用 flat 函數(shù)之后:'
# 返回展開數(shù)組中的下標(biāo)的對應(yīng)元素
print a.flat[5]
輸出如下:
原始數(shù)組:
[[0 1 2 3]
[4 5 6 7]]
調(diào)用 flat 函數(shù)之后:
5
numpy.ndarray.flatten
該函數(shù)返回折疊為一維的數(shù)組副本,函數(shù)接受下列參數(shù):
ndarray.flatten(order)
其中:
order:'C'-- 按行,'F'-- 按列,'A'-- 原順序,'k'-- 元素在內(nèi)存中的出現(xiàn)順序。
例子
import numpy as np
a = np.arange(8).reshape(2,4)
print '原數(shù)組:'
print a
print '\n'
# default is column-major
print '展開的數(shù)組:'
print a.flatten()
print '\n'
print '以 F 風(fēng)格順序展開的數(shù)組:'
print a.flatten(order = 'F')
輸出如下:
原數(shù)組:
[[0 1 2 3]
[4 5 6 7]]
展開的數(shù)組:
[0 1 2 3 4 5 6 7]
以 F 風(fēng)格順序展開的數(shù)組:
[0 4 1 5 2 6 3 7]
numpy.ravel
這個函數(shù)返回展開的一維數(shù)組,并且按需生成副本。返回的數(shù)組和輸入數(shù)組擁有相同數(shù)據(jù)類型。這個函數(shù)接受兩個參數(shù)。
numpy.ravel(a, order)
構(gòu)造器接受下列參數(shù):
order:'C'-- 按行,'F'-- 按列,'A'-- 原順序,'k'-- 元素在內(nèi)存中的出現(xiàn)順序。
例子
import numpy as np
a = np.arange(8).reshape(2,4)
print '原數(shù)組:'
print a
print '\n'
print '調(diào)用 ravel 函數(shù)之后:'
print a.ravel()
print '\n'
print '以 F 風(fēng)格順序調(diào)用 ravel 函數(shù)之后:'
print a.ravel(order = 'F')
輸出如下:
原數(shù)組:
[[0 1 2 3]
[4 5 6 7]]
調(diào)用 ravel 函數(shù)之后:
[0 1 2 3 4 5 6 7]
以 F 風(fēng)格順序調(diào)用 ravel 函數(shù)之后:
[0 4 1 5 2 6 3 7]
翻轉(zhuǎn)操作
| 序號 | 操作及描述 |
|---|---|
| 1. | transpose 翻轉(zhuǎn)數(shù)組的維度 |
| 2. | ndarray.T 和self.transpose()相同 |
| 3. | rollaxis 向后滾動指定的軸 |
| 4. | swapaxes 互換數(shù)組的兩個軸 |
修改維度
| 序號 | 維度和描述 |
|---|---|
| 1. | broadcast 產(chǎn)生模仿廣播的對象 |
| 2. | broadcast_to 將數(shù)組廣播到新形狀 |
| 3. | expand_dims 擴展數(shù)組的形狀 |
| 4. | squeeze 從數(shù)組的形狀中刪除單維條目 |
數(shù)組的連接
| 序號 | 數(shù)組及描述 |
|---|---|
| 1. | concatenate 沿著現(xiàn)存的軸連接數(shù)據(jù)序列 |
| 2. | stack 沿著新軸連接數(shù)組序列 |
| 3. | hstack 水平堆疊序列中的數(shù)組(列方向) |
| 4. | vstack 豎直堆疊序列中的數(shù)組(行方向) |
數(shù)組分割
| 序號 | 數(shù)組及操作 |
|---|---|
| 1. | split 將一個數(shù)組分割為多個子數(shù)組 |
| 2. | hsplit 將一個數(shù)組水平分割為多個子數(shù)組(按列) |
| 3. | vsplit 將一個數(shù)組豎直分割為多個子數(shù)組(按行) |
添加/刪除元素
| 序號 | 元素及描述 |
|---|---|
| 1. | resize 返回指定形狀的新數(shù)組 |
| 2. | append 將值添加到數(shù)組末尾 |
| 3. | insert 沿指定軸將值插入到指定下標(biāo)之前 |
| 4. | delete 返回刪掉某個軸的子數(shù)組的新數(shù)組 |
| 5. | unique 尋找數(shù)組內(nèi)的唯一元素 |
NumPy - 位操作
下面是 NumPy 包中可用的位操作函數(shù)。
| 序號 | 操作及描述 |
|---|---|
| 1. | bitwise_and 對數(shù)組元素執(zhí)行位與操作 |
| 2. | bitwise_or 對數(shù)組元素執(zhí)行位或操作 |
| 3. | invert 計算位非 |
| 4. | left_shift 向左移動二進制表示的位 |
| 5. | right_shift 向右移動二進制表示的位 |
示例
import numpy as np
print '13 和 17 的二進制形式:'
a,b = 13,17
print bin(a), bin(b)
print '\n'
print '13 和 17 的位與:'
print np.bitwise_and(13, 17)
輸出如下:
13 和 17 的二進制形式:
0b1101 0b10001
13 和 17 的位與:
1
你可以使用下表驗證此輸出。考慮下面的位與真值表。
| A | B | AND |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
NumPy - 字符串函數(shù)
以下函數(shù)用于對dtype為numpy.string_或numpy.unicode_的數(shù)組執(zhí)行向量化字符串操作。它們基于 Python 內(nèi)置庫中的標(biāo)準(zhǔn)字符串函數(shù)。
| 序號 | 函數(shù)及描述 |
|---|---|
| 1. | add() 返回兩個str或Unicode數(shù)組的逐個字符串連接 |
| 2. | multiply() 返回按元素多重連接后的字符串 |
| 3. | center() 返回給定字符串的副本,其中元素位于特定字符串的中央 |
| 4. | capitalize() 返回給定字符串的副本,其中只有第一個字符串大寫 |
| 5. | title() 返回字符串或 Unicode 的按元素標(biāo)題轉(zhuǎn)換版本 |
| 6. | lower() 返回一個數(shù)組,其元素轉(zhuǎn)換為小寫 |
| 7. | upper() 返回一個數(shù)組,其元素轉(zhuǎn)換為大寫 |
| 8. | split() 返回字符串中的單詞列表,并使用分隔符來分割 |
| 9. | splitlines() 返回元素中的行列表,以換行符分割 |
| 10. | strip() 返回數(shù)組副本,其中元素移除了開頭或者結(jié)尾處的特定字符 |
| 11. | join() 返回一個字符串,它是序列中字符串的連接 |
| 12. | replace() 返回字符串的副本,其中所有子字符串的出現(xiàn)位置都被新字符串取代 |
| 13. | decode() 按元素調(diào)用str.decode |
| 14. | encode() 按元素調(diào)用str.encode |
這些函數(shù)在字符數(shù)組類(numpy.char)中定義。較舊的 Numarray 包包含chararray類。numpy.char類中的上述函數(shù)在執(zhí)行向量化字符串操作時非常有用。
示例
import numpy as np
print '連接兩個字符串:'
print np.char.add(['hello'],[' xyz'])
print '\n'
print '連接示例:'
print np.char.add(['hello', 'hi'],[' abc', ' xyz'])
輸出如下:
連接兩個字符串:
['hello xyz']
連接示例:
['hello abc' 'hi xyz']
NumPy - 算數(shù)函數(shù)
很容易理解的是,NumPy 包含大量的各種數(shù)學(xué)運算功能。NumPy 提供標(biāo)準(zhǔn)的三角函數(shù),算術(shù)運算的函數(shù),復(fù)數(shù)處理函數(shù)等。
三角函數(shù)
NumPy 擁有標(biāo)準(zhǔn)的三角函數(shù),它為弧度制單位的給定角度返回三角函數(shù)比值。
舍入函數(shù)
numpy.around()
這個函數(shù)返回四舍五入到所需精度的值。該函數(shù)接受以下參數(shù)。
numpy.around(a,decimals)
其中:
| 序號 | 參數(shù)及描述 |
|---|---|
| 1. | a 輸入數(shù)組 |
| 2. | decimals 要舍入的小數(shù)位數(shù)。默認(rèn)值為0。如果為負(fù),整數(shù)將四舍五入到小數(shù)點左側(cè)的位置 |
NumPy - 算數(shù)運算
用于執(zhí)行算術(shù)運算(如add(),subtract(),multiply()和divide())的輸入數(shù)組必須具有相同的形狀或符合數(shù)組廣播規(guī)則。
示例
import numpy as np
a = np.arange(9, dtype = np.float_).reshape(3,3)
print '第一個數(shù)組:'
print a
print '\n'
print '第二個數(shù)組:'
b = np.array([10,10,10])
print b
print '\n'
print '兩個數(shù)組相加:'
print np.add(a,b)
print '\n'
print '兩個數(shù)組相減:'
print np.subtract(a,b)
print '\n'
print '兩個數(shù)組相乘:'
print np.multiply(a,b)
print '\n'
print '兩個數(shù)組相除:'
print np.divide(a,b)
輸出如下:
第一個數(shù)組:
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]
第二個數(shù)組:
[10 10 10]
兩個數(shù)組相加:
[[ 10. 11. 12.]
[ 13. 14. 15.]
[ 16. 17. 18.]]
兩個數(shù)組相減:
[[-10. -9. -8.]
[ -7. -6. -5.]
[ -4. -3. -2.]]
兩個數(shù)組相乘:
[[ 0. 10. 20.]
[ 30. 40. 50.]
[ 60. 70. 80.]]
兩個數(shù)組相除:
[[ 0. 0.1 0.2]
[ 0.3 0.4 0.5]
[ 0.6 0.7 0.8]]
NumPy - 統(tǒng)計函數(shù)
NumPy 有很多有用的統(tǒng)計函數(shù),用于從數(shù)組中給定的元素中查找最小,最大,百分標(biāo)準(zhǔn)差和方差等。函數(shù)說明如下:
numpy.amin() 和 numpy.amax()
這些函數(shù)從給定數(shù)組中的元素沿指定軸返回最小值和最大值。
numpy.ptp()
numpy.ptp()函數(shù)返回沿軸的值的范圍(最大值 - 最小值)。
numpy.percentile()
百分位數(shù)是統(tǒng)計中使用的度量,表示小于這個值得觀察值占某個百分比。函數(shù)numpy.percentile()接受以下參數(shù)。
numpy.percentile(a, q, axis)
其中:
| 序號 | 參數(shù)及描述 |
|---|---|
| 1. | a 輸入數(shù)組 |
| 2. | q 要計算的百分位數(shù),在 0 ~ 100 之間 |
| 3. | axis 沿著它計算百分位數(shù)的軸 |
numpy.median()
中值定義為將數(shù)據(jù)樣本的上半部分與下半部分分開的值。 numpy.median()函數(shù)的用法如下面的程序所示。
numpy.mean()
算術(shù)平均值是沿軸的元素的總和除以元素的數(shù)量。 numpy.mean()函數(shù)返回數(shù)組中元素的算術(shù)平均值。如果提供了軸,則沿其計算。
numpy.average()
加權(quán)平均值是由每個分量乘以反映其重要性的因子得到的平均值。 numpy.average()函數(shù)根據(jù)在另一個數(shù)組中給出的各自的權(quán)重計算數(shù)組中元素的加權(quán)平均值。該函數(shù)可以接受一個軸參數(shù)。如果沒有指定軸,則數(shù)組會被展開。
考慮數(shù)組[1,2,3,4]和相應(yīng)的權(quán)重[4,3,2,1],通過將相應(yīng)元素的乘積相加,并將和除以權(quán)重的和,來計算加權(quán)平均值。
加權(quán)平均值 = (1*4+2*3+3*2+4*1)/(4+3+2+1)
標(biāo)準(zhǔn)差
標(biāo)準(zhǔn)差是與均值的偏差的平方的平均值的平方根。標(biāo)準(zhǔn)差公式如下:
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)是1.1180339887498949。
方差
mean((x - x.mean())** 2)。換句話說,標(biāo)準(zhǔn)差是方差的平方根。
NumPy - 排序、搜索和計數(shù)函數(shù)
NumPy中提供了各種排序相關(guān)功能。這些排序函數(shù)實現(xiàn)不同的排序算法,每個排序算法的特征在于執(zhí)行速度,最壞情況性能,所需的工作空間和算法的穩(wěn)定性。下表顯示了三種排序算法的比較。
| 種類 | 速度 | 最壞情況 | 工作空間 | 穩(wěn)定性 |
|---|---|---|---|---|
'quicksort'(快速排序) |
1 | O(n^2) |
0 | 否 |
'mergesort'(歸并排序) |
2 | O(n*log(n)) |
~n/2 | 是 |
'heapsort'(堆排序) |
3 | O(n*log(n)) |
0 | 否 |
示例
import numpy as np
a = np.array([[3,7],[9,1]])
print '我們的數(shù)組是:'
print a
print '\n'
print '調(diào)用 sort() 函數(shù):'
print np.sort(a)
print '\n'
print '沿軸 0 排序:'
print np.sort(a, axis = 0)
print '\n'
# 在 sort 函數(shù)中排序字段
dt = np.dtype([('name', 'S10'),('age', int)])
a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt)
print '我們的數(shù)組是:'
print a
print '\n'
print '按 name 排序:'
print np.sort(a, order = 'name')
輸出如下:
我們的數(shù)組是:
[[3 7]
[9 1]]
調(diào)用 sort() 函數(shù):
[[3 7]
[1 9]]
沿軸 0 排序:
[[3 1]
[9 7]]
我們的數(shù)組是:
[('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]
按 name 排序:
[('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]
NumPy - 線性代數(shù)
NumPy 包包含numpy.linalg模塊,提供線性代數(shù)所需的所有功能。此模塊中的一些重要功能如下表所述。
| 序號 | 函數(shù)及描述 |
|---|---|
| 1. | dot 兩個數(shù)組的點積 |
| 2. | vdot 兩個向量的點積 |
| 3. | inner 兩個數(shù)組的內(nèi)積 |
| 4. | matmul 兩個數(shù)組的矩陣積 |
| 5. | determinant 數(shù)組的行列式 |
| 6. | solve 求解線性矩陣方程 |
| 7. | inv 尋找矩陣的乘法逆矩陣 |
示例
import numpy.matlib
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
np.dot(a,b)
輸出如下:
[[37 40]
[85 92]]
NumPy - Matplotlib
Matplotlib 是 Python 的繪圖庫。它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。它也可以和圖形工具包一起使用,如 PyQt 和 wxPython。
Matplotlib 模塊最初是由 John D. Hunter 編寫的。自 2012 年以來,Michael Droettboom 是主要開發(fā)者。目前,Matplotlib 1.5.1 是可用的穩(wěn)定版本。該軟件包可以二進制分發(fā),其源代碼形式在 www.matplotlib.org 上提供。
通常,通過添加以下語句將包導(dǎo)入到 Python 腳本中:
from matplotlib import pyplot as plt
這里pyplot()是 matplotlib 庫中最重要的函數(shù),用于繪制 2D 數(shù)據(jù)。以下腳本繪制方程y = 2x + 5:
示例
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y)
plt.show()
ndarray對象x由np.arange()函數(shù)創(chuàng)建為x軸上的值。y軸上的對應(yīng)值存儲在另一個數(shù)組對象y中。這些值使用matplotlib軟件包的pyplot子模塊的plot()函數(shù)繪制。
圖形由show()函數(shù)展示。
上面的代碼應(yīng)該產(chǎn)生以下輸出:

作為線性圖的替代,可以通過向plot()函數(shù)添加格式字符串來顯示離散值。可以使用以下格式化字符。
| 字符 | 描述 | |
|---|---|---|
'-' |
實線樣式 | |
'--' |
短橫線樣式 | |
'-.' |
點劃線樣式 | |
':' |
虛線樣式 | |
'.' |
點標(biāo)記 | |
',' |
像素標(biāo)記 | |
'o' |
圓標(biāo)記 | |
'v' |
倒三角標(biāo)記 | |
'^' |
正三角標(biāo)記 | |
'<' |
左三角標(biāo)記 | |
'>' |
右三角標(biāo)記 | |
'1' |
下箭頭標(biāo)記 | |
'2' |
上箭頭標(biāo)記 | |
'3' |
左箭頭標(biāo)記 | |
'4' |
右箭頭標(biāo)記 | |
's' |
正方形標(biāo)記 | |
'p' |
五邊形標(biāo)記 | |
'*' |
星形標(biāo)記 | |
'h' |
六邊形標(biāo)記 1 | |
'H' |
六邊形標(biāo)記 2 | |
'+' |
加號標(biāo)記 | |
'x' |
X 標(biāo)記 | |
'D' |
菱形標(biāo)記 | |
'd' |
窄菱形標(biāo)記 | |
| '|' | 豎直線標(biāo)記 | |
'_' |
水平線標(biāo)記 |
還定義了以下顏色縮寫。
| 字符 | 顏色 |
|---|---|
'b' |
藍(lán)色 |
'g' |
綠色 |
'r' |
紅色 |
'c' |
青色 |
'm' |
品紅色 |
'y' |
黃色 |
'k' |
黑色 |
'w' |
白色 |
要顯示圓來代表點,而不是上面示例中的線,請使用ob作為plot()函數(shù)中的格式字符串。
示例
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y,"ob")
plt.show()
上面的代碼應(yīng)該產(chǎn)生以下輸出:

繪制正弦波
以下腳本使用 matplotlib 生成正弦波圖。
示例
import numpy as np
import matplotlib.pyplot as plt
# 計算正弦曲線上點的 x 和 y 坐標(biāo)
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave form")
# 使用 matplotlib 來繪制點
plt.plot(x, y)
plt.show()

subplot()
subplot()函數(shù)允許你在同一圖中繪制不同的東西。在下面的腳本中,繪制正弦和余弦值。
示例
import numpy as np
import matplotlib.pyplot as plt
# 計算正弦和余弦曲線上的點的 x 和 y 坐標(biāo)
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 建立 subplot 網(wǎng)格,高為 2,寬為 1
# 激活第一個 subplot
plt.subplot(2, 1, 1)
# 繪制第一個圖像
plt.plot(x, y_sin)
plt.title('Sine')
# 將第二個 subplot 激活,并繪制第二個圖像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 展示圖像
plt.show()
上面的代碼應(yīng)該產(chǎn)生以下輸出:

bar()
pyplot子模塊提供bar()函數(shù)來生成條形圖。以下示例生成兩組x和y數(shù)組的條形圖。
示例
from matplotlib import pyplot as plt
x = [5,8,10]
y = [12,16,6]
x2 = [6,9,11]
y2 = [6,15,7]
plt.bar(x, y, align = 'center')
plt.bar(x2, y2, color = 'g', align = 'center')
plt.title('Bar graph')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
NumPy - 使用 Matplotlib 繪制直方圖
NumPy 有一個numpy.histogram()函數(shù),它是數(shù)據(jù)的頻率分布的圖形表示。水平尺寸相等的矩形對應(yīng)于類間隔,稱為bin,變量height對應(yīng)于頻率。
numpy.histogram()
numpy.histogram()函數(shù)將輸入數(shù)組和bin作為兩個參數(shù)。 bin數(shù)組中的連續(xù)元素用作每個bin的邊界。
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]) ]
np.histogram(a,bins = [0,20,40,60,80,100])
hist,bins = np.histogram(a,bins = [0,20,40,60,80,100])
print hist
print bins
輸出如下:
[3 4 5 2 1]
[0 20 40 60 80 100]
plt()
Matplotlib 可以將直方圖的數(shù)字表示轉(zhuǎn)換為圖形。 pyplot子模塊的plt()函數(shù)將包含數(shù)據(jù)和bin數(shù)組的數(shù)組作為參數(shù),并轉(zhuǎn)換為直方圖。
from matplotlib import pyplot as plt
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
plt.hist(a, bins = [0,20,40,60,80,100])
plt.title("histogram")
plt.show()
輸出如下:

你看到的只是NumPy教程的冰山一角,因全部內(nèi)容過多,完整教程可以在公眾號后臺回復(fù)NumPy直接獲取。
