Task02:索引
學習目標:
Task2:索引(3天)
學習內容:
掌握陣列的索引與切片,熟悉陣列迭代。
學習產出:
副本與檢視
在 Numpy 中,尤其是在做陣列運算或陣列操作時,返回結果不是陣列的 副本 就是 檢視。
在 Numpy 中,所有賦值運算不會為陣列和陣列中的任何元素建立副本。
- numpy.ndarray.copy() 函式建立一個副本。 對副本資料進行修改,不會影響到原始資料,它們實體記憶體不在同一位置。
【例】
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x
y[0] = -1
print(x)
# [-1 2 3 4 5 6 7 8]
print(y)
# [-1 2 3 4 5 6 7 8]
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x.copy()
y[0] = -1
print(x)
# [1 2 3 4 5 6 7 8]
print(y)
# [-1 2 3 4 5 6 7 8]
【例】陣列切片操作返回的物件只是原陣列的檢視。
import numpy as np
x = np.array([[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]])
y = x
y[::2, :3:2] = -1
print(x)
# [[-1 12 -1 14 15]
# [16 17 18 19 20]
# [-1 22 -1 24 25]
# [26 27 28 29 30]
# [-1 32 -1 34 35]]
print(y)
# [[-1 12 -1 14 15]
# [16 17 18 19 20]
# [-1 22 -1 24 25]
# [26 27 28 29 30]
# [-1 32 -1 34 35]]
x = np.array([[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]])
y = x.copy()
y[::2, :3:2] = -1
print(x)
# [[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(y)
# [[-1 12 -1 14 15]
# [16 17 18 19 20]
# [-1 22 -1 24 25]
# [26 27 28 29 30]
# [-1 32 -1 34 35]]
索引與切片
陣列索引機制指的是用方括號([])加序號的形式引用單個陣列元素,它的用處很多,比如抽取元素,選取陣列的幾個元素,甚至為其賦一個新值。
整數索引
【例】要獲取陣列的單個元素,指定元素的索引即可。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(x[2]) # 3
x = np.array([[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(x[2]) # [21 22 23 24 25]
print(x[2][1]) # 22
print(x[2, 1]) # 22
切片索引
切片操作是指抽取陣列的一部分元素生成新陣列。對 python 列表進行切片操作得到的陣列是原陣列的副本,而對 Numpy 資料進行切片操作得到的陣列則是指向相同緩衝區的檢視。
如果想抽取(或檢視)陣列的一部分,必須使用切片語法,也就是,把幾個用冒號( start:stop:step )隔開的數字置於方括號內。
為了更好地理解切片語法,還應該瞭解不明確指明起始和結束位置的情況。如省去第一個數字,numpy 會認為第一個數字是0;如省去第二個數字,numpy 則會認為第二個數字是陣列的最大索引值;如省去最後一個數字,它將會被理解為1,也就是抽取所有元素而不再考慮間隔。
【例】對一維陣列的切片
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(x[0:2]) # [1 2]
#用下標0~5,以2為步長選取陣列
print(x[1:5:2]) # [2 4]
print(x[2:]) # [3 4 5 6 7 8]
print(x[:2]) # [1 2]
print(x[-2:]) # [7 8]
print(x[:-2]) # [1 2 3 4 5 6]
print(x[:]) # [1 2 3 4 5 6 7 8]
#利用負數下標翻轉陣列
print(x[::-1]) # [8 7 6 5 4 3 2 1]
【例】對二維陣列切片
import numpy as np
x = np.array([[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(x[0:2])
# [[11 12 13 14 15]
# [16 17 18 19 20]]
print(x[1:5:2])
# [[16 17 18 19 20]
# [26 27 28 29 30]]
print(x[2:])
# [[21 22 23 24 25]
# [26 27 28 29 30]
# [31 32 33 34 35]]
print(x[:2])
# [[11 12 13 14 15]
# [16 17 18 19 20]]
print(x[-2:])
# [[26 27 28 29 30]
# [31 32 33 34 35]]
print(x[:-2])
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [21 22 23 24 25]]
print(x[:])
# [[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(x[2, :]) # [21 22 23 24 25]
print(x[:, 2]) # [13 18 23 28 33]
print(x[0, 1:4]) # [12 13 14]
print(x[1:4, 0]) # [16 21 26]
print(x[1:3, 2:4])
# [[18 19]
# [23 24]]
print(x[:, :])
# [[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(x[::2, ::2])
# [[11 13 15]
# [21 23 25]
# [31 33 35]]
print(x[::-1, :])
# [[31 32 33 34 35]
# [26 27 28 29 30]
# [21 22 23 24 25]
# [16 17 18 19 20]
# [11 12 13 14 15]]
print(x[:, ::-1])
# [[15 14 13 12 11]
# [20 19 18 17 16]
# [25 24 23 22 21]
# [30 29 28 27 26]
# [35 34 33 32 31]]
dots 索引
NumPy 允許使用…表示足夠多的冒號來構建完整的索引列表。
比如,如果 x 是 5 維陣列:
- x[1,2,…] 等於 x[1,2,:,:,:]
- x[…,3] 等於 x[:,:,:,:,3]
- x[4,…,5,:] 等於 x[4,:,:,5,:]
【例】
import numpy as np
x = np.random.randint(1, 100, [2, 2, 3])
print(x)
# [[[ 5 64 75]
# [57 27 31]]
#
# [[68 85 3]
# [93 26 25]]]
print(x[1, ...])
# [[68 85 3]
# [93 26 25]]
print(x[..., 2])
# [[75 31]
# [ 3 25]]
整數陣列索引
【例】方括號內傳入多個索引值,可以同時選擇多個元素。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
r = [0, 1, 2]
print(x[r])
# [1 2 3]
r = [0, 1, -1]
print(x[r])
# [1 2 8]
x = np.array([[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]])
r = [0, 1, 2]
print(x[r])
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [21 22 23 24 25]]
r = [0, 1, -1]
print(x[r])
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [31 32 33 34 35]]
r = [0, 1, 2]
c = [2, 3, 4]
y = x[r, c]
print(y)
# [13 19 25]
【例】
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
r = np.array([[0, 1], [3, 4]])
print(x[r])
# [[1 2]
# [4 5]]
x = np.array([[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]])
r = np.array([[0, 1], [3, 4]])
print(x[r])
# [[[11 12 13 14 15]
# [16 17 18 19 20]]
#
# [[26 27 28 29 30]
# [31 32 33 34 35]]]
# 獲取了 5X5 陣列中的四個角的元素。
# 行索引是 [0,0] 和 [4,4],而列索引是 [0,4] 和 [0,4]。
r = np.array([[0, 0], [4, 4]])
c = np.array([[0, 4], [0, 4]])
y = x[r, c]
print(y)
# [[11 15]
# [31 35]]
【例】可以藉助切片:與整數陣列組合。
import numpy as np
x = np.array([[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]])
y = x[0:3, [1, 2, 2]]
print(y)
# [[12 13 13]
# [17 18 18]
# [22 23 23]]
numpy. take(a, indices, axis=None, out=None, mode=‘raise’) Take elements from an array along an axis.
【例】
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
r = [0, 1, 2]
print(np.take(x, r))
# [1 2 3]
r = [0, 1, -1]
print(np.take(x, r))
# [1 2 8]
x = np.array([[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]])
r = [0, 1, 2]
print(np.take(x, r, axis=0))
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [21 22 23 24 25]]
r = [0, 1, -1]
print(np.take(x, r, axis=0))
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [31 32 33 34 35]]
r = [0, 1, 2]
c = [2, 3, 4]
y = np.take(x, [r, c])
print(y)
# [[11 12 13]
# [13 14 15]]
應注意:使用切片索引到numpy陣列時,生成的陣列檢視將始終是原始陣列的子陣列, 但是整數陣列索引,不是其子陣列,是形成新的陣列。 切片索引
import numpy as np
a=np.array([[1,2],[3,4],[5,6]])
b=a[0:1,0:1]
b[0,0]=2
print(a[0,0]==b)
#[[True]]
整數陣列索引
import numpy as np
a=np.array([[1,2],[3,4],[5,6]])
b=a[0,0]
b=2
print(a[0,0]==b)
#False
布林索引
我們可以通過一個布林陣列來索引目標陣列。
【例】
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x > 5
print(y)
# [False False False False False True True True]
print(x[x > 5])
# [6 7 8]
x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
y = np.logical_not(np.isnan(x))
print(x[y])
# [1. 2. 3. 4. 5.]
x = np.array([[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]])
y = x > 25
print(y)
# [[False False False False False]
# [False False False False False]
# [False False False False False]
# [ True True True True True]
# [ True True True True True]]
print(x[x > 25])
# [26 27 28 29 30 31 32 33 34 35]
【例】
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
print(len(x)) # 50
plt.plot(x, y)
mask = y >= 0
print(len(x[mask])) # 25
print(mask)
'''
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'bo')
mask = np.logical_and(y >= 0, x <= np.pi / 2)
print(mask)
'''
[ True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'go')
plt.show()
我們利用這些條件來選擇圖上的不同點。藍色點(在圖中還包括綠點,但綠點掩蓋了藍色點),顯示值 大於0 的所有點。綠色點表示值 大於0 且 小於0.5π 的所有點。
陣列迭代
除了for迴圈,Numpy 還提供另外一種更為優雅的遍歷方法。
- apply_along_axis(func1d, axis, arr) Apply a function to 1-D slices along the given axis.
【例】
import numpy as np
x = np.array([[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]])
y = np.apply_along_axis(np.sum, 0, x)
print(y) # [105 110 115 120 125]
y = np.apply_along_axis(np.sum, 1, x)
print(y) # [ 65 90 115 140 165]
y = np.apply_along_axis(np.mean, 0, x)
print(y) # [21. 22. 23. 24. 25.]
y = np.apply_along_axis(np.mean, 1, x)
print(y) # [13. 18. 23. 28. 33.]
def my_func(x):
return (x[0] + x[-1]) * 0.5
y = np.apply_along_axis(my_func, 0, x)
print(y) # [21. 22. 23. 24. 25.]
y = np.apply_along_axis(my_func, 1, x)
print(y) # [13. 18. 23. 28. 33.]
相關文章
- task02
- task02 啟航
- Task02:Numpy常用函式函式
- 【Task02】Numpy學習打卡
- Task02:藝術畫筆見乾坤(4天)
- 2016百度前端技術學院Task02前端
- 天池python學習-task02打卡第五天Python
- 天池新聞推薦入門賽之【資料分析】Task02
- Python Numpy 切片和索引(高階索引、布林索引、花式索引)Python索引
- 主鍵索引 (聚集索引) 和普通索引 (輔助索引) 的區別索引
- mysql索引之字首索引MySql索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- 理解索引:索引優化索引優化
- 從InnoDB 索引執行簡述 聚集索引和非聚集索引、覆蓋索引、回表、索引下推索引
- mongodb建立索引和刪除索引和背景索引backgroundMongoDB索引
- MySQL 字串索引和字首索引MySql字串索引
- MySQL索引系列:全文索引MySql索引
- SQL Server索引 - 非聚集索引SQLServer索引
- 索引索引
- MySQL 唯一索引和普通索引MySql索引
- mysql組合索引,abc索引命中MySql索引
- 索引與null(二):組合索引索引Null
- 什麼索引算是好的索引索引
- 索引與null(一):單列索引索引Null
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- ElasticSearch分片互動過程(建立索引、刪除索引、查詢索引)Elasticsearch索引
- MYSQL索引及高效能索引策略MySql索引
- MySQL索引(二):建索引的原則MySql索引
- MySQL 聚簇索引 和覆蓋索引MySql索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- MySQL 索引MySql索引
- 索引器索引
- 07索引索引
- 六、索引索引
- [Mysql]索引MySql索引
- NumPy 索引索引
- mysql索引MySql索引