numpy二维数组改变某些数_【每天15分钟,5天学会NumPy】第1天:基本概念
1.NumPy 的家族
NumPy 是 SciPy 家族的一員,而且是最重要的成員。SciPy 家族(見下圖)是一個(gè)專門應(yīng)用于數(shù)學(xué)、科學(xué)和工程領(lǐng)域的開源的Python生態(tài)圈。NumPy 最初是 SciPy 的一部分,后來獨(dú)立出來了。SciPy 家族的主體,可以概括為 MSN 這三個(gè)字母,你要是喜歡足球的話,一定會聯(lián)想到巴薩的梅西、蘇亞雷斯和內(nèi)馬爾這個(gè)MSN三劍客組合。我喜歡把 Matplotlib 、 SciPy 和 NumPy 叫做 MSN 組合,并專門寫了一篇博文,名字就叫《數(shù)學(xué)建模三劍客MSN》。
NumPy 的安裝,非常簡單,直接使用pip命令安裝即可。通常,安裝 NumPy 的時(shí)候,也會順便安裝 SciPy 模塊、matplotlib 模塊。
> PS D:\>python –m pip install numpy> PS D:\>python –m pip install scipy> PS D:\>python –m pip install matplotlib使用 NumPy 時(shí),我們習(xí)慣把它簡寫成 np。提醒大家注意:pip 命令需要在命令行窗口中運(yùn)行,而不是在下圖所示的 IDEL 窗口中。在 IDEL 窗口中可以交互式執(zhí)行 Python 語句,是學(xué)習(xí) Python 的有力工具。
2.NumPy 是數(shù)據(jù)處理和科學(xué)計(jì)算的基礎(chǔ)
NumPy 是 Python 科學(xué)計(jì)算的基礎(chǔ)軟件包,提供了多維數(shù)組對象,多種派生對象(掩碼數(shù)組、矩陣等)以及用于快速操作數(shù)組的函數(shù)及 API,它包括數(shù)學(xué)、邏輯、數(shù)組形狀變換、排序、選擇、I/O 、離散傅立葉變換、基本線性代數(shù)、基本統(tǒng)計(jì)運(yùn)算、隨機(jī)模擬等等。和 Python 的列表相比,NumPy 擁有明顯的速度優(yōu)勢。NumPy底層使用C語言編寫,內(nèi)置了并行運(yùn)算功能,并且內(nèi)部解除了GIL(全局解釋器鎖)。這意味著:- 其對數(shù)組的操作速度不受Python解釋器的限制
- 當(dāng)系統(tǒng)有多個(gè)CPU時(shí),NumPy可以自動并行計(jì)算
- OpenCV:目前以人臉識別、自動駕駛等技術(shù)為代表的人工智能方興未艾,其背后的圖像和視覺處理,幾乎都離不開 OpenCV,而 OpenCV 庫中圖像的數(shù)據(jù)結(jié)構(gòu),從 CV2 之后,全面轉(zhuǎn)向了 NumPy,用 OpenCV 打開圖像文件,得到的就是 NumPy 數(shù)組
- OpenGL:在三維領(lǐng)域大名鼎鼎的OpenGL,更是深度依賴NumPy,如果沒有NumPy,我們無法想象如何操作動輒幾萬、幾十萬,甚至幾百萬的頂點(diǎn)數(shù)據(jù)集
- Pandas:這個(gè)是當(dāng)下非常流行的數(shù)據(jù)分析工具包,相信很多人都是從Pandas開始接觸數(shù)據(jù)處理的,而Pandas整個(gè)就是基于NumPy之上的擴(kuò)展
- Matplotlib:作為NumPy生態(tài)圈的重要成員,二者關(guān)系自然是密不可分的
- scikit-learn:機(jī)器學(xué)習(xí)領(lǐng)域應(yīng)用最廣泛的工具包,則是建立在NumPy/SciPy/Matplotlib之上的,同樣深度依賴NumPy
3.NumPy 數(shù)組 VS Python 列表
學(xué)過 Python 的同學(xué)都知道,Python 的列表操作非常靈活,而 NumPy 數(shù)組繼承了 Python 數(shù)組操作便捷、靈活的特點(diǎn),又具有極高的、接近 C 語言的運(yùn)行效率。可以說,NumPy 數(shù)組是專為處理科學(xué)數(shù)據(jù)而生的。
NumPy 數(shù)組中的元素必須具有相同的數(shù)據(jù)類型,Python 列表的元素類型則不受限制;
NumPy 數(shù)組一旦創(chuàng)建,其元素?cái)?shù)量不可再改變,Python 列表的元素則可以動態(tài)增減;
NumPy 數(shù)組和 Python 同樣操作簡單、靈活,但前者內(nèi)置方法更多、運(yùn)行速度更快。
4.NumPy 數(shù)組的數(shù)據(jù)類型
NumPy支持的數(shù)據(jù)類型主要有整型(integrate)、浮點(diǎn)型(float)、布爾型(bool)和復(fù)數(shù)型(complex),每一種數(shù)據(jù)類型根據(jù)占用內(nèi)存的字節(jié)數(shù)又分為多個(gè)不同的子類型。當(dāng)然,NumPy 也支持自定義類型,我們在后面講解數(shù)組排序的時(shí)候,再討論自定義類型。
咱們來演示一下如何查看、指定數(shù)據(jù)類型。
>>> a = np.array([0,1,2,3])>>> a.dtypedtype('int32')>>> a = np.array([0,1,2,3.0])>>> a.dtypedtype('float64')>>> a = np.array([0,1,2,3+0j])>>> a.dtypedtype('complex128')>>> a = np.array([0,1,2,3], dtype=np.int16)>>> a.dtypedtype('int16')>>> a = np.array([0,1,2,3], dtype=np.uint8)>>> a.dtypedtype('uint8')dtype 是數(shù)組的屬性之一,可以很方便地查看數(shù)組的數(shù)據(jù)類型。創(chuàng)建數(shù)組時(shí),如果不指定數(shù)據(jù)類型,NumPy 會根據(jù)輸入數(shù)據(jù)選擇合適的數(shù)據(jù)類型。指定數(shù)據(jù)類型的時(shí)候,通常可以省略類型后面的數(shù)字。如果省略數(shù)字的話,整形和無符號整形默認(rèn)是32位的,浮點(diǎn)型默認(rèn)是64位的,復(fù)數(shù)型默認(rèn)是128位。
5.NumPy 數(shù)組的屬性剛才我們用 dtype 可以查看數(shù)組的數(shù)據(jù)類型,dtype 是數(shù)組對象的屬性之一,除了 dtype,NumPy 數(shù)組還有其他一些屬性,比如,shape,數(shù)組結(jié)構(gòu),或者叫形狀;sizes,數(shù)組元素個(gè)數(shù);itemsize,數(shù)組元素字節(jié)數(shù);flags,數(shù)組的內(nèi)存信息;real,數(shù)組實(shí)部;imag,數(shù)據(jù)虛部;data,存儲區(qū)域內(nèi)存地址,相當(dāng)于指針。除此之外,還有一個(gè)屬性,ndim,數(shù)組的維度數(shù),也叫秩,下一節(jié)會專門講它。屬性看起來有點(diǎn)多,但我們只需要記住 dtype 和 shape 兩個(gè)屬性就足夠了。這兩個(gè)屬性非常重要,重要到你可以忽略其他的屬性。
| 屬性 | 說明 |
| ndarray.dtype | 元素類型 |
| ndarray.shape | 數(shù)組結(jié)構(gòu) |
| ndarray.size | 元素個(gè)數(shù) |
| ndarray.itemsize | 每個(gè)元素的大小,以字節(jié)為單位 |
| ndarray.ndim | 數(shù)組的維度數(shù),也叫秩 |
| ndarray.flags | 數(shù)組的內(nèi)存信息 |
| ndarray.real | 元素的實(shí)部 |
| ndarray.imag | 元素的虛部 |
| ndarray.data | 元素?cái)?shù)組的實(shí)際存儲區(qū) |
下面是這些屬性的演示操作:
>>> a = np.arange(24, dtype=np.complex64).reshape((2,3,4))>>> a.dtype # 復(fù)數(shù)類型dtype('complex64')>>> a.shape # 2層3行4列(2, 3, 4)>>> a.size # 總共24個(gè)元素24>>> a.itemsize # 每個(gè)元素占用8個(gè)字節(jié)8>>> a.flags # 存儲信息 C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False>>> a.real # 實(shí)部array([[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], [[12., 13., 14., 15.], [16., 17., 18., 19.], [20., 21., 22., 23.]]], dtype=float32)>>> a.imag # 虛部array([[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]], dtype=float32)>>> a.data # 內(nèi)存區(qū)域地址0x00000157D820BC78>>>> a.ndim # 維度數(shù)(秩)36.維、秩、軸
維,就是維度。我們說數(shù)組是幾維的,就是指維度,3維的數(shù)組,其維度數(shù),自然就是3。維度數(shù),有一個(gè)專用名字,叫做秩,也就是上一節(jié)提到的數(shù)組屬性 ndim。秩,這個(gè)名字感覺有些多余,不如維度數(shù)更容易理解。但是,軸的概念,大家一定要建立起來,并且要理解,因?yàn)檩S的概念很重要。簡單來說,我們可以把數(shù)組的軸,和笛卡爾坐標(biāo)系的軸對應(yīng)一下。
一維數(shù)組,類比于一維空間,只有一個(gè)軸,那就是0軸。
二維數(shù)組,類比于二維平面,有兩個(gè)軸,我們習(xí)慣表示成行、列,那么行的方向就是0軸,列的方向就是1軸。
三維數(shù)組,類比于三維空間,有三個(gè)軸,我們習(xí)慣表示成層、行、列,那么層的方向就是0軸,行的方向就是1軸,列的方向就是2軸。
我們用一個(gè)求和的例子來演示一下軸概念的重要性。先來看看用 Python 的求和。
>>> a = [2,5,4,7,9,3] # python的求和函數(shù)sum(),只能對一維列表求和>>> sum(a)30>>> a = [[3,5,1],[2,6,9]] # 如果是多維列表,那就會報(bào)錯(cuò)了>>> sum(a)Traceback (most recent call last): File "", line 1, in <module> sum(a)TypeError: unsupported operand type(s) for +: 'int' and 'list'```但有時(shí)候,我們的需求會比較復(fù)雜,比如,分層求和,逐行求和,逐列求和等。這時(shí)候,Numpy 的軸概念就可以大顯身手了。>>> a = np.arange(18).reshape((3,2,3)) # 3層2行3列的結(jié)構(gòu)>>> aarray([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]], [[12, 13, 14], [15, 16, 17]]])>>> np.sum(a)153 >>> np.sum(a, axis=0) # 層合并求和array([[18, 21, 24], [27, 30, 33]])>>> np.sum(a, axis=1) # 行合并求和array([[ 3, 5, 7], [15, 17, 19], [27, 29, 31]])>>> np.sum(a, axis=2) # 列合并求和array([[ 3, 12], [21, 30], [39, 48]])>>> np.sum(np.sum(a, axis=1), axis=1) # 分層求和方法1array([15, 51, 87])>>> np.sum(np.sum(a, axis=1), axis=0) # 分層求和方法2array([15, 51, 87])同樣是求和,顯然,NumPy數(shù)組要比Python列表更強(qiáng)大、更靈活。
7.廣播和矢量化
在講兩個(gè)概念之前,我們先思考兩個(gè)問題:
我們先用python數(shù)組實(shí)現(xiàn):
>>> x = list(range(5))>>> for i in range(len(x)): # 遍歷數(shù)組為每個(gè)元素加1 x[i] += 1>>> y = list(range(5,10))>>> z = list()>>> for i, j in zip(x, y): # 遍歷兩個(gè)數(shù)組,逐個(gè)元素求和 z.append(i+j)我們再用NumPy數(shù)組實(shí)現(xiàn):
>>> a = np.arange(5)>>> a += 1>>> b = np.arange(5,10)>>> c = a + b顯然,用NumPy數(shù)組實(shí)現(xiàn)起來,要比python數(shù)組更簡潔、更清晰。這得益于NumPy的兩大特性:廣播(broadcast)和矢量化(vectorization)。
廣播和矢量化,是 NumPy 最精髓的特性,是 NumPy 的靈魂。所謂廣播,就是將對數(shù)組的操作映射到每個(gè)數(shù)組元素上;矢量化可以理解為代碼中沒有顯式的循環(huán)、索引等。NumPy數(shù)組最重要的特性是廣播和矢量化,體現(xiàn)在性能上,就是接近C語言的運(yùn)行效率,體現(xiàn)在代碼上,則有這樣的特點(diǎn):
總結(jié)
以上是生活随笔為你收集整理的numpy二维数组改变某些数_【每天15分钟,5天学会NumPy】第1天:基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 输出二进制_Python之输入输
- 下一篇: macbook所有型号大全_提高MacB