黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Python Numpy基礎(chǔ)教程

系統(tǒng) 2264 0

本文是一個(gè)關(guān)于Python numpy的基礎(chǔ)學(xué)習(xí)教程,其中,Python版本為Python 3.x


image

什么是Numpy

Numpy = Numerical + Python,它是Python中科學(xué)計(jì)算的核心庫(kù),可以高效的處理多維數(shù)組的計(jì)算。并且,因?yàn)樗脑S多底層函數(shù)是用C語(yǔ)言編寫(xiě)的,所以運(yùn)算速度敲快。

基礎(chǔ)知識(shí)

ndarray

NumPy的主要對(duì)象是同類(lèi)型的多維數(shù)組ndarray。它是一個(gè)通用的同構(gòu)數(shù)據(jù)多維容器,所有的元素必須是 相同類(lèi)型 的,并通過(guò)正整數(shù)元組索引。利用該對(duì)象可以對(duì)整塊數(shù)據(jù)執(zhí)行一些數(shù)學(xué)運(yùn)算,語(yǔ)法和標(biāo)量元素之間的運(yùn)算一樣。在NumPy中,維度稱(chēng)為軸,軸的數(shù)目為rank。

介紹一下ndarray常用的屬性:

  1. ndarray.shape:表示各個(gè)維度中數(shù)組的大小,是一個(gè)整數(shù)的元組
  2. ndarray.dtype:描述數(shù)組中元素類(lèi)型的對(duì)象
  3. ndarray.ndim:數(shù)組中軸的個(gè)數(shù)
  4. ndarray.size:數(shù)組元素的總數(shù)
  5. ndarray.itemsize:數(shù)組中每個(gè)元素的字節(jié)大小

創(chuàng)建數(shù)組

創(chuàng)建數(shù)組通常有5種方式:

1. 由Python結(jié)構(gòu)(list, tuple等)轉(zhuǎn)換

創(chuàng)建數(shù)組最簡(jiǎn)單的辦法就是使用array對(duì)象,它可以接受任何序列型的對(duì)象,然后產(chǎn)生一個(gè)新的含有傳入數(shù)據(jù)的numpy數(shù)組(ndarray)。
舉個(gè)最簡(jiǎn)單的例子:

          
            import numpy as np
'''
遇到不懂的問(wèn)題?Python學(xué)習(xí)交流群:821460695滿(mǎn)足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!
'''
a = np.array([1, 2, 3])
print(a)
print(a.dtype)
print(a.shape)

          
        
  1. 使用Numpy原生數(shù)組創(chuàng)建(arange, ones,zeros等)

如:

          
            b = np.zeros(10)
c = np.ones((1, 2))

          
        
  1. 從磁盤(pán)讀取數(shù)組

使用np.load方法讀取數(shù)據(jù)。

  1. 使用字符串或緩沖區(qū)從原始字節(jié)創(chuàng)建數(shù)組

  2. 使用特殊庫(kù)函數(shù)(random等)

索引和切片

基礎(chǔ)操作
一維數(shù)組中的索引表面看起來(lái)和Python list的功能差不多。

對(duì)于切片而言,當(dāng)你將一個(gè)標(biāo)量值賦值給一個(gè)切片時(shí),該值會(huì)自動(dòng)傳播到整個(gè)選區(qū),跟Python list最重要的區(qū)別在于:Numpy中數(shù)組的切片作用的是原始數(shù)據(jù)的視圖,也就是數(shù)據(jù)沒(méi)有被復(fù)制,所有的修改都會(huì)直接作用到源數(shù)據(jù)。這是因?yàn)椋琋umpy設(shè)計(jì)之初就是為了處理大數(shù)據(jù),將數(shù)據(jù)復(fù)制來(lái)復(fù)制去自然會(huì)產(chǎn)生很多性能問(wèn)題。如果你想要得到一份數(shù)據(jù)副本,就需要顯式的使用.copy()方法。

舉個(gè)例子:

          
            arr = np.arange(10)
print(arr)
print(arr[0])
print(arr[1:6])
arr_slice = arr[1:6]
arr_slice[1:3] = 5
print(arr_slice)
print(arr)
arr_copy = arr[1:6].copy()
arr_copy[1:3] = 6
print(arr_copy)
print(arr)

          
        

對(duì)于多維數(shù)組,各索引位置上的元素不再是標(biāo)量,而是數(shù)組,可以傳入一個(gè)以逗號(hào)隔開(kāi)的索引列表來(lái)訪(fǎng)問(wèn)單個(gè)元素。其它操作和一維數(shù)組相同。

舉個(gè)例子:

          
            arr_2d = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_2d[0])
print(arr_2d[0, 1])
arr_2d_slice = arr_2d[1]
print(arr_2d_slice)
arr_2d_slice[0] = 1
print(arr_2d_slice)
print(arr_2d)

          
        

切片索引
ndarray的切片語(yǔ)法和Python list類(lèi)似,對(duì)于高維對(duì)象,花樣比較多,可以在一個(gè)或者多個(gè)軸進(jìn)行切片,也可以跟整數(shù)索引混合使用(降低維度)。

舉個(gè)例子:

          
            arr_test = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_test[:2])
print(arr_test[:2, 1:])
print(arr_test[1, :1])
arr_slice_test = arr_test[:2, 1:]
arr_slice_test[0] = 0
print( arr_slice_test)
print(arr_test)

          
        

布爾型索引

通過(guò)布爾型索引,可以方便我們根據(jù)指定條件快速的檢索數(shù)組中的元素。如果進(jìn)行變量或者標(biāo)定量的大數(shù)據(jù)處理,這種篩選功能的使用肯定會(huì)給程序的設(shè)計(jì)帶來(lái)極大的便捷。

舉個(gè)簡(jiǎn)單例子:

          
            In [1]: import numpy as np
In [2]: x = np.array([[0, 1], [2, 3], [3, 4]])
In [3]: x
Out[3]:
array([[0, 1],
       [2, 3],
       [3, 4]])
In [4]: x > 2
Out[4]:
array([[False, False],
       [False,  True],
       [ True,  True]])
In [5]: x[ x > 2] = 0
In [6]: x
Out[6]:
array([[0, 1],
       [2, 0],
       [0, 0]])

          
        

并且,可以結(jié)合使用ndarray的統(tǒng)計(jì)方法來(lái)對(duì)布爾型數(shù)組中的True值進(jìn)行計(jì)數(shù),常見(jiàn)有三種方法:

sum():對(duì)True值進(jìn)行計(jì)數(shù)
any():測(cè)試數(shù)組中是否存在一個(gè)或者多個(gè)True
all():檢查數(shù)組中的所有值是否都是True
花式索引

花式索引(Fancy indexing)是一個(gè)Numpy的術(shù)語(yǔ),指的是利用整數(shù)數(shù)組進(jìn)行索引。

花式索引根據(jù)索引數(shù)組的值作為目標(biāo)數(shù)組的某個(gè)軸的下標(biāo)來(lái)取值。對(duì)于使用一維整型數(shù)組作為索引,如果目標(biāo)是一維數(shù)組,那么索引的結(jié)果就是對(duì)應(yīng)位置的元素;如果目標(biāo)是二維數(shù)組,那么就是對(duì)應(yīng)下標(biāo)的行。

花式索引跟切片不一樣,它總是將數(shù)據(jù)復(fù)制到新數(shù)組中。

舉個(gè)例子:

          
            In [1]: import numpy as np

In [2]: array = np.empty((4, 3))

In [3]: for i in range(4):
   ...:     array[i] = i
   ...:

In [4]: array
Out[4]:
array([[0., 0., 0.],
       [1., 1., 1.],
       [2., 2., 2.],
       [3., 3., 3.]])

In [5]: array[[1, 3]]
Out[5]:
array([[1., 1., 1.],
       [3., 3., 3.]])

In [6]: array[[-1, -3]]
Out[6]:
array([[3., 3., 3.],
       [1., 1., 1.]])

In [7]: array[np.ix_([3, 0],[2, 1])]
Out[7]:
array([[3., 3.],
       [0., 0.]])

          
        

形狀操作

形狀轉(zhuǎn)換

介紹幾個(gè)常見(jiàn)的修改數(shù)組形狀的方法:

  • reshape():不改變?cè)紨?shù)據(jù)的情況下修改數(shù)組

  • flat():一個(gè)數(shù)組元素的迭代器,可以處理數(shù)組元素中的每個(gè)數(shù)據(jù)

  • flatten():返回一份數(shù)組拷貝,對(duì)拷貝所做的處理不會(huì)影響原始數(shù)組,格式為.flatten(order=''),其中order='C'表示按行展開(kāi),'F'表示按列,'A'表示原順序,'K'表示元素在內(nèi)存中的出現(xiàn)順序。

  • ravel():展平的數(shù)組元素,順序通常是"C風(fēng)格",返回的是數(shù)組視圖,修改會(huì)影響原始數(shù)組。

該函數(shù)接收兩個(gè)參數(shù):

舉個(gè)例子:

          
            arr = np.arange(12)
print(arr)
arr1 = arr.reshape(3, 4)

for item in arr1:
    print(item)
for item in arr1.flat:
    print(item)

print(arr1.flatten())
print(arr1.flatten(order="K"))
arr.flatten()[10] = 0
print(arr)

print(arr.ravel())
arr.ravel()[10] = 0
print(arr)

          
        

轉(zhuǎn)置與軸對(duì)換

介紹常見(jiàn)的幾種方法:

  • ndarray.T:轉(zhuǎn)置
  • transpose: 對(duì)換數(shù)組的維數(shù)
  • rollaxis: 向后滾動(dòng)指定的軸
  • swapaxes:用于交換數(shù)組的兩個(gè)軸

轉(zhuǎn)置是數(shù)據(jù)重塑的一種特殊形式,返回了源數(shù)據(jù)的視圖。簡(jiǎn)單的轉(zhuǎn)置可以使用.T,也可以使用transpose方法和swapaxes。

舉個(gè)例子:

          
            arr = np.arange(12).reshape((2, 2, 3))
print(arr)
print(arr.T)
print(arr.transpose((1, 0, 2)))
print(arr.swapaxes(1, 2))

          
        

通用函數(shù):快速的元素級(jí)數(shù)組函數(shù)
通用函數(shù)(ufunc)是一種對(duì)ndarray中的數(shù)據(jù)執(zhí)行元素級(jí)運(yùn)算的函數(shù),可將其分為一元和二元進(jìn)行說(shuō)明。

一元func

一元func可看做是簡(jiǎn)單的元素級(jí)變體,比如sqrt和cos,舉個(gè)例子:

arr = np.arange(10)
print(np.sqrt(arr))
print(np.square(arr))
二元func

接受2個(gè)數(shù)組,然后返回一個(gè)結(jié)果數(shù)組,比如add和mod,舉個(gè)例子:

arr1 = np.arange(10)
arr2 = np.arange(10)
print(np.add(arr1, arr2))
更多函數(shù)去官方文檔查閱,哈哈,這里就不贅述了。

數(shù)組運(yùn)算
基礎(chǔ)運(yùn)算

在Numpy中,可以利用ndarray對(duì)整塊數(shù)據(jù)執(zhí)行一些數(shù)學(xué)運(yùn)算,語(yǔ)法和普通的標(biāo)量元素之間的運(yùn)算一樣。其中,數(shù)組與標(biāo)量的運(yùn)算會(huì)將標(biāo)量作用于各個(gè)數(shù)組元素。

舉個(gè)例子:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])
print(i + j)
print(i - j)
print(i - 1)
print(i * j)
print( i / j)
以上,乘法并不同于矩陣乘法,若需進(jìn)行矩陣相乘,可使用:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])

print(j.dot(i))
除此之外,Numpy還提供了以下常用統(tǒng)計(jì)方法:

min():數(shù)組最小值
max():數(shù)組最大值
sum():數(shù)組元素相加
cumsum():計(jì)算軸向元素累加和,返回由中間結(jié)果組成的數(shù)組
cumprod():所有元素的累計(jì)積
數(shù)組表達(dá)式

編寫(xiě)數(shù)組表達(dá)式處理多個(gè)數(shù)組數(shù)據(jù)也是很便捷高效的,舉個(gè)例子:假設(shè)我們想要在一組值(網(wǎng)格型)上計(jì)算函數(shù)sqrt(x^2 + y^2),使用np.mashgrid函數(shù)接受兩個(gè)一維數(shù)組,產(chǎn)生兩個(gè)二維矩陣:

In [1]: import numpy as np

In [2]: points = np.arange(-5, 5, 0.01)

In [3]: x, y = np.meshgrid(points, points)

In [4]: x
Out[4]:
array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])

In [5]: z = np.sqrt(x ** 2 + y ** 2)

In [6]: z
Out[6]:
array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,
7.06400028],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
...,
[7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,
7.04279774],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568]])
條件篩選

介紹幾個(gè)常見(jiàn)的篩選方法:

where:返回輸入數(shù)組中滿(mǎn)足給定條件的元素的索引
.argmax() 和 numpy.argmin()函數(shù)分別沿給定軸返回最大和最小元素的索引
nonzero() 函數(shù)返回輸入數(shù)組中非零元素的索引。
實(shí)例
接下來(lái),使用Numpy來(lái)模擬隨機(jī)漫步操作下數(shù)組運(yùn)算。

首先,實(shí)現(xiàn)一個(gè)很簡(jiǎn)單的1000步的隨機(jī)漫步,從0開(kāi)始,隨機(jī)生成1和-1,判斷隨機(jī)漫步過(guò)程中第一次到達(dá)某個(gè)值(暫定為8)的時(shí)間(步數(shù)),實(shí)現(xiàn):

import numpy as np
nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)

各步的累計(jì)和

walk = steps.cumsum()

第一次到達(dá)8的時(shí)間

walk_8 = (np.abs(walk) >= 8).argmax()
print(walk_8)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論