收藏&下載 | 最全的NumPy 教程,沒有之一
譯者:飛龍? ? ?鏈接:
https://www.jianshu.com/p/57e3c0a92f3a
原文:
https://www.tutorialspoint.com/numpy/index.htm
友情提示:本文較長,是教程的一部分,值得收藏,文末提供下載方式哦!覺得內(nèi)容精彩一定要點一下“好看”哦!
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選項,這會把你帶到在線編譯器。所以快來使用它,享受你的學習吧。
標準的 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ù)組標量類型的 Python 對象表示。下圖顯示了ndarray,數(shù)據(jù)類型對象(dtype)和數(shù)組標量類型之間的關(guān)系。

ndarray類的實例可以通過本教程后面描述的不同的數(shù)組創(chuàng)建例程來構(gòu)造?;镜?code>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?可選,默認為true,對象是否被復(fù)制。 |
| 4. | order?C(按行)、F(按列)或A(任意,默認)。 |
| 5. | subok?默認情況下,返回的數(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]**ndarray ** 對象由計算機內(nèi)存中的一維連續(xù)區(qū)域組成,帶有將每個元素映射到內(nèi)存塊中某個位置的索引方案。內(nèi)存塊以按行(C 風格)或按列(FORTRAN 或 MatLab 風格)的方式保存元素。
NumPy - 數(shù)據(jù)類型
NumPy 支持比 Python 更多種類的數(shù)值類型。下表顯示了 NumPy 中定義的不同標量數(shù)據(jù)類型。
| 序號 | 數(shù)據(jù)類型及描述 |
|---|---|
| 1. | bool_?存儲為一個字節(jié)的布爾值(真或假) |
| 2. | int_?默認整數(shù),相當于 C 的long,通常為int32或int64 |
| 3. | intc?相當于 C 的int,通常為int32或int64 |
| 4. | intp?用于索引的整數(shù),相當于 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ù)組標量類型 ?
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)的標量數(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定義切片對象。當這個切片對象傳遞給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ù)(以:分隔),則對兩個索引(不包括停止索引)之間的元素以默認步驟進行切片。
NumPy - 高級索引
如果一個ndarray是非元組序列,數(shù)據(jù)類型為整數(shù)或布爾值的ndarray,或者至少一個元素為序列對象的元組,我們就能夠用它來索引ndarray。高級索引始終返回數(shù)據(jù)的副本。與此相反,切片只提供了一個視圖。
有兩種類型的高級索引:整數(shù)和布爾值。
整數(shù)索引
這種機制有助于基于 N 維索引來獲取數(shù)組中任意元素。每個整數(shù)數(shù)組表示該維度的下標值。當索引的元素個數(shù)就是目標ndarray的維度時,會變得相當直接。
以下示例獲取了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]]布爾索引
當結(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 的標準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 55NumPy - 數(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)當兼容原有形狀order:'C'為 C 風格順序,'F'為 F 風格順序,'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ù)組中的下標的對應(yīng)元素
print a.flat[5]輸出如下:
原始數(shù)組:
[[0 1 2 3]
[4 5 6 7]]
調(diào)用 flat 函數(shù)之后:
5numpy.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 風格順序展開的數(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 風格順序展開的數(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 風格順序調(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 風格順序調(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 沿指定軸將值插入到指定下標之前 |
| 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 |
| ?| ?| 1 | 1 | 0 | 1 |
| --- | --- |
| AND |
| | 1 | 0 | 0 | 0 | 1 |
| result | 0 | 0 | 0 | 0 | 1 |
NumPy - 字符串函數(shù)
以下函數(shù)用于對dtype為numpy.string_或numpy.unicode_的數(shù)組執(zhí)行向量化字符串操作。它們基于 Python 內(nèi)置庫中的標準字符串函數(shù)。
| 序號 | 函數(shù)及描述 |
|---|---|
| 1. | add() 返回兩個str或Unicode數(shù)組的逐個字符串連接 |
| 2. | multiply() 返回按元素多重連接后的字符串 |
| 3. | center() 返回給定字符串的副本,其中元素位于特定字符串的中央 |
| 4. | capitalize() 返回給定字符串的副本,其中只有第一個字符串大寫 |
| 5. | title() 返回字符串或 Unicode 的按元素標題轉(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ù)學運算功能。NumPy 提供標準的三角函數(shù),算術(shù)運算的函數(shù),復(fù)數(shù)處理函數(shù)等。
三角函數(shù)
NumPy 擁有標準的三角函數(shù),它為弧度制單位的給定角度返回三角函數(shù)比值。
舍入函數(shù)
numpy.around()
這個函數(shù)返回四舍五入到所需精度的值。該函數(shù)接受以下參數(shù)。
numpy.around(a,decimals)其中:
| 序號 | 參數(shù)及描述 |
|---|---|
| 1. | a?輸入數(shù)組 |
| 2. | decimals?要舍入的小數(shù)位數(shù)。默認值為0。如果為負,整數(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ù)組中給定的元素中查找最小,最大,百分標準差和方差等。函數(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)標準差
標準差是與均值的偏差的平方的平均值的平方根。標準差公式如下:
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)。換句話說,標準差是方差的平方根。
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 上提供。
通常,通過添加以下語句將包導入到 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ù)添加格式字符串來顯示離散值。可以使用以下格式化字符。
| 字符 | 描述 | |
|---|---|---|
'-' | 實線樣式 | |
'--' | 短橫線樣式 | |
'-.' | 點劃線樣式 | |
':' | 虛線樣式 | |
'.' | 點標記 | |
',' | 像素標記 | |
'o' | 圓標記 | |
'v' | 倒三角標記 | |
'^' | 正三角標記 | |
'<' | 左三角標記 | |
'>' | 右三角標記 | |
'1' | 下箭頭標記 | |
'2' | 上箭頭標記 | |
'3' | 左箭頭標記 | |
'4' | 右箭頭標記 | |
's' | 正方形標記 | |
'p' | 五邊形標記 | |
'*' | 星形標記 | |
'h' | 六邊形標記 1 | |
'H' | 六邊形標記 2 | |
'+' | 加號標記 | |
'x' | X 標記 | |
'D' | 菱形標記 | |
'd' | 窄菱形標記 | |
| `' | '` | 豎直線標記 |
'_' | 水平線標記 |
還定義了以下顏色縮寫。
| 字符 | 顏色 |
|---|---|
'b' | 藍色 |
'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 坐標
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 坐標
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()輸出如下:

