亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python Numpy基礎教程

系統 2117 0

本文是一個關于Python numpy的基礎學習教程,其中,Python版本為Python 3.x


image

什么是Numpy

Numpy = Numerical + Python,它是Python中科學計算的核心庫,可以高效的處理多維數組的計算。并且,因為它的許多底層函數是用C語言編寫的,所以運算速度敲快。

基礎知識

ndarray

NumPy的主要對象是同類型的多維數組ndarray。它是一個通用的同構數據多維容器,所有的元素必須是 相同類型 的,并通過正整數元組索引。利用該對象可以對整塊數據執行一些數學運算,語法和標量元素之間的運算一樣。在NumPy中,維度稱為軸,軸的數目為rank。

介紹一下ndarray常用的屬性:

  1. ndarray.shape:表示各個維度中數組的大小,是一個整數的元組
  2. ndarray.dtype:描述數組中元素類型的對象
  3. ndarray.ndim:數組中軸的個數
  4. ndarray.size:數組元素的總數
  5. ndarray.itemsize:數組中每個元素的字節大小

創建數組

創建數組通常有5種方式:

1. 由Python結構(list, tuple等)轉換

創建數組最簡單的辦法就是使用array對象,它可以接受任何序列型的對象,然后產生一個新的含有傳入數據的numpy數組(ndarray)。
舉個最簡單的例子:

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

          
        
  1. 使用Numpy原生數組創建(arange, ones,zeros等)

如:

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

          
        
  1. 從磁盤讀取數組

使用np.load方法讀取數據。

  1. 使用字符串或緩沖區從原始字節創建數組

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

索引和切片

基礎操作
一維數組中的索引表面看起來和Python list的功能差不多。

對于切片而言,當你將一個標量值賦值給一個切片時,該值會自動傳播到整個選區,跟Python list最重要的區別在于:Numpy中數組的切片作用的是原始數據的視圖,也就是數據沒有被復制,所有的修改都會直接作用到源數據。這是因為,Numpy設計之初就是為了處理大數據,將數據復制來復制去自然會產生很多性能問題。如果你想要得到一份數據副本,就需要顯式的使用.copy()方法。

舉個例子:

          
            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)

          
        

對于多維數組,各索引位置上的元素不再是標量,而是數組,可以傳入一個以逗號隔開的索引列表來訪問單個元素。其它操作和一維數組相同。

舉個例子:

          
            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的切片語法和Python list類似,對于高維對象,花樣比較多,可以在一個或者多個軸進行切片,也可以跟整數索引混合使用(降低維度)。

舉個例子:

          
            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)

          
        

布爾型索引

通過布爾型索引,可以方便我們根據指定條件快速的檢索數組中的元素。如果進行變量或者標定量的大數據處理,這種篩選功能的使用肯定會給程序的設計帶來極大的便捷。

舉個簡單例子:

          
            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]])

          
        

并且,可以結合使用ndarray的統計方法來對布爾型數組中的True值進行計數,常見有三種方法:

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

花式索引(Fancy indexing)是一個Numpy的術語,指的是利用整數數組進行索引。

花式索引根據索引數組的值作為目標數組的某個軸的下標來取值。對于使用一維整型數組作為索引,如果目標是一維數組,那么索引的結果就是對應位置的元素;如果目標是二維數組,那么就是對應下標的行。

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

舉個例子:

          
            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.]])

          
        

形狀操作

形狀轉換

介紹幾個常見的修改數組形狀的方法:

  • reshape():不改變原始數據的情況下修改數組

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

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

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

該函數接收兩個參數:

舉個例子:

          
            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)

          
        

轉置與軸對換

介紹常見的幾種方法:

  • ndarray.T:轉置
  • transpose: 對換數組的維數
  • rollaxis: 向后滾動指定的軸
  • swapaxes:用于交換數組的兩個軸

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

舉個例子:

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

          
        

通用函數:快速的元素級數組函數
通用函數(ufunc)是一種對ndarray中的數據執行元素級運算的函數,可將其分為一元和二元進行說明。

一元func

一元func可看做是簡單的元素級變體,比如sqrt和cos,舉個例子:

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

接受2個數組,然后返回一個結果數組,比如add和mod,舉個例子:

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

數組運算
基礎運算

在Numpy中,可以利用ndarray對整塊數據執行一些數學運算,語法和普通的標量元素之間的運算一樣。其中,數組與標量的運算會將標量作用于各個數組元素。

舉個例子:

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)
以上,乘法并不同于矩陣乘法,若需進行矩陣相乘,可使用:

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

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

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

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

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]])
條件篩選

介紹幾個常見的篩選方法:

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

首先,實現一個很簡單的1000步的隨機漫步,從0開始,隨機生成1和-1,判斷隨機漫步過程中第一次到達某個值(暫定為8)的時間(步數),實現:

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

各步的累計和

walk = steps.cumsum()

第一次到達8的時間

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产毛片在线高清视频 | 九九热在线精品 | 国产乱人免费视频 | 成人午夜在线播放 | 亚洲日本中文 | 国产精品久久影院 | 亚洲精品人成无码中文毛片 | 九九久久亚洲综合久久久 | 日韩在线免费视频观看 | 99热久久精里都是精品66 | 国产成人a v在线影院 | 精品一区二区三区亚洲 | 久久91精品综合国产首页 | 美女被羞羞视频网站在线 | 成人在线小视频 | 日本一级aaaa特黄毛片 | 玖玖爱免费 | 国产精品高清视亚洲一区二区 | 国产精品视频第一区二区三区 | 日韩国产欧美视频 | 毛片视频播放 | 美女牲交视频一级毛片 | 国产精品亚洲欧美大片在线看 | 国产乱人伦av在线a 国产乱人伦精品一区二区 国产乱人伦偷精品视频不卡 | 亚欧视频在线观看 | 一本大道香蕉中文在线高清 | a视频在线观看 | 精品久久久久久久久久久 | 亚洲欧美日韩国产一区图片 | 国产精品日韩欧美久久综合 | 亚洲精品一二区 | 成人欧美一区二区三区在线 | 亚洲国产精品日韩高清秒播 | 国产乱码精品一区二区 | 亚洲国产成人超福利久久精品 | 毛片永久新网址首页 | 成人a毛片久久免费播放 | 在线不欧美 | 四虎影院2019 | 免费久久精品 | 国产高清美女一级a毛片久久w |