1. 程式人生 > >Python-Numpy多維陣列--切片,索引,高階索引,布林索引

Python-Numpy多維陣列--切片,索引,高階索引,布林索引

一、Numpy 切片和索引

ndarray物件的內容可以通過索引或切片來訪問和修改,就像 Python 的內建容器物件一樣。

如前所述,ndarray物件中的元素遵循基於零的索引。 有三種可用的索引方法型別: 欄位訪問,基本切片高階索引

基本切片是 Python 中基本切片概念到 n 維的擴充套件。 通過將startstopstep引數提供給內建的slice函式來構造一個 Python slice物件。 此slice物件被傳遞給陣列來提取陣列的一部分。

DEMO 1
 

import numpy as np
a = np.arange(10)
s = slice(2,7,2)
print a[s]
輸出如下:[2 4 6]

在上面的例子中,ndarray物件由arange()函式建立。 然後,分別用起始,終止和步長值272定義切片物件。 當這個切片物件傳遞給ndarray時,會對它的一部分進行切片,從索引27,步長為2。通過將由冒號分隔的切片引數(start:stop:step)直接提供給ndarray物件,也可以獲得相同的結果。

DEMO 2

import numpy as np
a = np.arange(10)
b = a[2:7:2]
print b
輸出如下:[2 4 6]

如果只輸入一個引數,則將返回與索引對應的單個專案。 如果使用a:,則從該索引向後的所有專案將被提取。 如果使用兩個引數(以:

分隔),則對兩個索引(不包括停止索引)之間的元素以預設步驟進行切片。

DEMO 3

# 對單個元素進行切片
import numpy as np
a = np.arange(10)
b = a[5]
print b
輸出如下:5

DEMO 4

# 對始於索引的元素進行切片
import numpy as np
a = np.arange(10)
print a[2:]
輸出如下:[2 3 4 5 6 7 8 9]

DEMO 5

# 對索引之間的元素進行切片
import numpy as np
a = np.arange(10)
print a[2:5]
輸出如下:[2 3 4]
上面的描述也可用於多維ndarray。

DEMO 6

import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print a
# 對始於索引的元素進行切片
print '現在我們從索引 a[1:] 開始對陣列切片'
print a[1:]
輸出如下:
[[1 2 3]
[3 4 5]
[4 5 6]]
現在我們從索引 a[1:] 開始對陣列切片
[[3 4 5]
[4 5 6]]
切片還可以包括省略號(...),來使選擇元組的長度與陣列的維度相同。 如果在行位置使用省略號,它將返回包含行中元素的ndarray。

DEMO 7

# 最開始的陣列
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print '我們的陣列是:'
print a
print '\n'
# 這會返回第二列元素的陣列:
print '第二列的元素是:'
print a[...,1]
print '\n'
# 現在我們從第二行切片所有元素:
print '第二行的元素是:'
print a[1,...]
print '\n'
# 現在我們從第二列向後切片所有元素:
print '第二列及其剩餘元素是:'
print a[...,1:]
輸出如下:我們的陣列是:
[[1 2 3]
[3 4 5]
[4 5 6]]
第二列的元素是:
[2 4 5]
第二行的元素是:
[3 4 5]
第二列及其剩餘元素是:
[[2 3]
[4 5]
[5 6]]

二、Numpy - 高階索引

如果一個ndarray是非元組序列,資料型別為整數或布林值的ndarray,或者至少一個元素為序列物件的元組,我們就能夠用它來索引ndarray。高階索引始終返回資料的副本。 與此相反,切片只提供了一個檢視。

有兩種型別的高階索引:整數和布林值。

1.整數索引

這種機制有助於基於 N 維索引來獲取陣列中任意元素。 每個整數陣列表示該維度的下標值。 當索引的元素個數就是目標ndarray的維度時,會變得相當直接。

以下示例獲取了ndarray物件中每一行指定列的一個元素。 因此,行索引包含所有行號,列索引指定要選擇的元素。

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print y
輸出如下:[1 4 5]
該結果包括陣列中(0,0),(1,1)和(2,0)位置處的元素。

下面的示例獲取了 4X3 陣列中的每個角處的元素。 行索引是[0,0][3,3],而列索引是[0,2][0,2]

示例 2

import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print '我們的陣列是:'
print x
print '\n'
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print '這個陣列的每個角處的元素是:'
print y
輸出如下:我們的陣列是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
這個陣列的每個角處的元素是:
[[ 0 2]
[ 9 11]]
返回的結果是包含每個角元素的ndarray物件。

高階和基本索引可以通過使用切片:或省略號...與索引陣列組合。 以下示例使用slice作為列索引和高階索引。 當切片用於兩者時,結果是相同的。 但高階索引會導致複製,並且可能有不同的記憶體佈局。

DEMO 3
 

import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print '我們的陣列是:'
print x
# 切片
z = x[1:4,1:3]
print '切片之後,我們的陣列變為:'
print z
# 對列使用高階索引
y = x[1:4,[1,2]]
print '對列使用高階索引來切片:'
Print y
輸出如下:我們的陣列是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
切片之後,我們的陣列變為:
[[ 4 5]
[ 7 8]
[10 11]]
對列使用高階索引來切片:
[ 4 5]
[ 7 8]
[10 11]]

三、布林索引

當結果物件是布林運算(例如比較運算子)的結果時,將使用此型別的高階索引。

DEMO 1

這個例子中,大於 5 的元素會作為布林索引的結果返回。
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print '我們的陣列是:'
print x
# 現在我們會打印出大於 5 的元素
print '大於 5 的元素是:'
print x[x > 5]
輸出如下:我們的陣列是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大於 5 的元素是:[ 6 7 8 9 10 11]

DEMO 2

這個例子使用了~(取補運算子)來過濾NaN
 

import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print a[~np.isnan(a)]
輸出如下:[ 1. 2. 3. 4. 5.]

DEMO 3

以下示例顯示如何從陣列中過濾掉非複數元素。

import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print a[np.iscomplex(a)]
輸出如下:[2.0+6.j 3.5+5.j]