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