Python NumPy教程之索引詳解

NumPy 或 Numeric Python 是一個用於計算同質 n 維數組的包。在 numpy 維度中稱為軸。

為什麼我們需要 NumPy 

出現瞭一個問題,當 python 列表已經存在時,為什麼我們需要 NumPy。答案是我們不能直接對兩個列表的所有元素執行操作。例如,我們不能直接將兩個列表相乘,我們必須逐個元素地進行。這就是 NumPy 發揮作用的地方。

示例 #1:

# 演示需要 NumPy 的 Python 程序
 
list1 = [1, 2, 3, 4 ,5, 6]
list2 = [10, 9, 8, 7, 6, 5]
 
# 將兩個列表直接相乘會出錯。
print(list1*list2)

輸出 :

TypeError: can't multiply sequence by non-int of type 'list'

因為這可以通過 NumPy 數組輕松完成。

示例 #2:

# 演示 NumPy 數組使用的 Python 程序
import numpy as np
 
list1 = [1, 2, 3, 4, 5, 6]
list2 = [10, 9, 8, 7, 6, 5]
 
# 將 list1 轉換為 NumPy 數組
a1 = np.array(list1)
 
# 將 list2 轉換為 NumPy 數組
a2 = np.array(list2)
 
print(a1*a2)

輸出 :

array([10, 18, 24, 28, 30, 30])

python的numpy包具有以不同方式索引的強大功能。

使用索引數組進行索引

索引可以通過使用數組作為索引在 numpy 中完成。在切片的情況下,返回數組的視圖或淺表副本,但在索引數組中返回原始數組的副本。Numpy 數組可以用其他數組或任何其他序列索引,但元組除外。最後一個元素由 -1 索引,第二個由 -2 索引,依此類推。

示例 #1:

# 演示索引數組使用的 Python 程序。
import numpy as np
 
# 創建一個從 10 到 1 的整數序列,步長為 -2
a = np.arange(10, 1, -2) 
print("\n A sequential array with a negative step: \n",a)
 
# 索引在 np.array 方法中指定。
newarr = a[np.array([3, 1, 2 ])]
print("\n Elements at these indices are:\n",newarr)

輸出 :

A sequential array with a negative step:
[10  8  6  4  2]

Elements at these indices are:
[4 8 6]

示例 #2:

import numpy as np
 
# 元素從 1 到 9 的 NumPy 數組
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# 索引值可以是負數。
arr = x[np.array([1, 3, -3])]
print("\n Elements are : \n",arr)

輸出 :

Elements are:
[2 4 7]

索引類型

有兩種類型的索引:

基本切片和索引

考慮語法 x[obj],其中 x 是數組,obj 是索引。切片對象是基本切片情況下的索引。當 obj 為 時發生基本切片:

  • 形式為 start : stop : step 的切片對象
  • 一個整數
  • 或切片對象和整數的元組

基本切片生成的所有數組始終是原始數組的視圖。

代碼#1:

# 用於基本切片的 Python 程序。
import numpy as np
 
# 從 0 到 19 排列元素
a = np.arange(20)
print("\n Array is:\n ",a)
 
# a[start:stop:step]
print("\n a[-8:17:1]  = ",a[-8:17:1]) 
 
# : 運算符表示直到最後的所有元素。
print("\n a[10:]  = ",a[10:])

輸出 :

Array is:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

a[-8:17:1]  =  [12 13 14 15 16]

a[10:] = [10 11 12 13 14 15 16 17 18 19] 

代碼#2:

# 用於基本切片和索引的 Python 程序
import numpy as np
 
# A 3-Dimensional array
a = np.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]
              [24, 25, 26, 27, 28, 29]
              [30, 31, 32, 33, 34, 35]]
print("\n Array is:\n ",a)
 
# 切片和索引
print("\n a[0, 3:5]  = ",a[0, 3:5]) 
 
print("\n a[4:, 4:]  = ",a[4:, 4:]) 
 
print("\n a[:, 2]  = ",a[:, 2]) 
 
print("\n a[2:;2, ::2]  = ",a[2:;2, ::2]) 

輸出 :

Array is:
 [[0  1  2  3  4  5] 
  [6 7 8 9 10 11]
  [12 13 14 15 16 17]
  [18 19 20 21 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

a[0, 3:5]  =  [3 4]

a[4:, 4:] = [[28 29],
             [34 35]]

a[:, 2] =  [2 8 14 20 26 32]

a[2:;2, ::2] = [[12 14 16],
                [24 26 28]]

下圖讓概念更清晰:

省略號也可以與基本切片一起使用。省略號 (…) 是 : 對象的數量,需要創建一個長度與數組維度相同的選擇元組。

# 使用帶省略號的基本切片進行索引的 Python 程序
import numpy as np
 
# A 3 dimensional array.
b = np.array([[[1, 2, 3],[4, 5, 6]],
              [[7, 8, 9],[10, 11, 12]]])
 
print(b[...,1]) #Equivalent to b[: ,: ,1 ]

輸出 :

[[ 2 5] 
 [ 8 11]]

高級索引

當 obj 為 – 時觸發高級索引

  • 整數或佈爾類型的 ndarray
  • 或具有至少一個序列對象的元組
  • 是一個非元組序列對象

高級索引返回數據的副本而不是它的視圖。高級索引有整數和佈爾兩種類型。

純整數索引: 當整數用於索引時。第一維的每個元素都與第二維的元素配對。所以本例中元素的索引為 (0,0),(1,0),(2,1) 並選擇相應的元素。

# 顯示高級索引的 Python 程序
import numpy as np
 
a = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]])
print(a[[0 ,1 ,2 ],[0 ,0 ,1]])

輸出 :

[1 3 6]

結合高級索引和基本索引

當索引中至少有一個切片 (:)、省略號 (…) 或 newaxis 時(或者數組的維度多於高級索引),則行為可能會更復雜。這就像連接每個高級索引元素的索引結果

在最簡單的情況下,隻有一個高級索引。例如,單個高級索引可以替換切片,結果數組將是相同的,但是,它是一個副本並且可能具有不同的內存佈局。如果可能,切片是優選的。

# 顯示高級和基本索引的 Python 程序
import numpy as np
 
a = np.array([[0 ,1 ,2],[3 ,4 ,5 ],
              [6 ,7 ,8],[9 ,10 ,11]])
 
print(a[1:2 ,1:3 ])
print(a[1:2 ,[1,2]])

輸出 :

[4, 5] 
[4, 5]

瞭解情況的最簡單方法可能是根據結果形狀進行思考。索引操作有兩個部分,由基本索引(不包括整數)定義的子空間和來自高級索引部分的子空間。需要區分兩種索引組合的情況:

高級索引由切片、省略號或 newaxis 分隔。例如x[arr1, :, arr2].

高級索引都彼此相鄰。例如x[..., arr1, arr2, :],但不是x[arr1, :, 1] 因為 1 在這方面是一個高級索引。

在第一種情況下,高級索引操作產生的維度首先出現在結果數組中,然後是子空間維度。在第二種情況下,來自高級索引操作的維度被插入到結果數組中與它們在初始數組中相同的位置(後一種邏輯使簡單的高級索引的行為就像切片一樣)。

佈爾數組索引

這個索引有一些佈爾表達式作為索引。返回滿足該佈爾表達式的那些元素。它用於過濾所需的元素值。

代碼 #1

# 您可能希望選擇大於 50 的數字
import numpy as np
 
a = np.array([10, 40, 80, 50, 100])
print(a[a>50])

輸出 :

[80 100]

代碼 #2

# 您可能希望將 40 的倍數平方
import numpy as np
 
a = np.array([10, 40, 80, 50, 100])
print(a[a%40==0]**2)

輸出 :

[1600 6400])

代碼 #3

# 您可能希望選擇行之和是 10 的倍數的那些元素。
import numpy as np
 
b = np.array([[5, 5],[4, 5],[16, 4]])
sumrow = b.sum(-1)
print(b[sumrow%10==0])

輸出 :

array([[ 5, 5], [16, 4]])

到此這篇關於Python NumPy教程之索引詳解的文章就介紹到這瞭,更多相關Python Numpy索引內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: