การจัดดัชนีของ ndarrays สามารถทำได้โดยใช้ไวยากรณ์ x[obj] มาตรฐานของ Python โดยที่ x คืออาร์เรย์และ obj คือการเลือก
มีการจัดดัชนี 3 ประเภท:
- field access
- basic slicing
- advanced indexing
ประเภทของการจัดดัชนีที่จะใช้ขึ้นอยู่กับ obj ในส่วนนี้ เราจะเน้นหลักที่ basic slicing และ advanced indexing
เราสามารถแบ่ง advanced indexing เป็นสองส่วน:
- Integer array indexing
- Boolean indexing
Basic Slicing (การสไลซ์พื้นฐาน)
แนวคิดพื้นฐานของการสไลซ์ใน Python ถูกขยายใน basic slicing ไปสู่ n มิติ เหมือนกับ slice object ของ Python ที่สร้างขึ้นโดยการให้พารามิเตอร์ start, stop และ step ให้กับฟังก์ชัน slice เพื่อรับผลลัพธ์เฉพาะ slice object จะถูกส่งไปยังอาร์เรย์เพื่อดึงส่วนหนึ่งของอาร์เรย์
ตัวอย่าง 1
import numpy as np arr = np.arange(25) s = slice(2, 21, 4) print(arr[s])
ผลลัพธ์
[ 2 6 10 14 18]
ในตัวอย่างข้างต้น เราสร้างออบเจกต์ ndarray (arr) โดยใช้ฟังก์ชัน arange() ก่อน แล้วสร้าง slice object โดยกำหนดค่า start, stop และ step ให้กับมัน (s) เมื่อเราส่ง slice object ไปยัง ndarray เราจะได้ส่วน (slice) ของอาร์เรย์เริ่มจากดัชนี 2 ถึง 21 ด้วย step 4
อีกวิธีหนึ่งในการเขียนโปรแกรมข้างต้น:
# Another way to write above program import numpy as np arr = np.arange(25) s = arr[2:21:4] print(s)
ผลลัพธ์
[ 2 6 10 14 18]
สไลซ์รายการเดียว
# Slice single item from an array import numpy as np arr = np.arange(10) s = arr[9] print(s)
ผลลัพธ์
9
สไลซ์รายการเริ่มจากดัชนี
# slice item starting from index import numpy as np arr = np.arange(10) s = arr[3:] print(s)
ผลลัพธ์
[3 4 5 6 7 8 9]
สไลซ์รายการระหว่างดัชนี
# slice item between indexes import numpy as np arr = np.arange(10) s = arr[3:7] print(s)
ผลลัพธ์
[3 4 5 6]
สองวิธีข้างต้นจะใช้กับ ndarray หลายมิติได้เช่นกัน เช่นด้านล่าง:
# slice item between indexes import numpy as np arr = np.array([[[1],[2],[3]], [[4],[5],[6]], [[7], [8], [9]]]) s = arr[1:] print(s)
ผลลัพธ์
[[[4] [5] [6]] [[7] [8] [9]]]
Advanced Indexing (การจัดดัชนีขั้นสูง)
Integer array indexing:
ลองสร้างอาร์เรย์ง่ายๆ ด้วยจำนวนเต็ม:
arr = np.array([[1,2],[3,4],[5,6]]) print(arr)
ผลลัพธ์
[[1 2] [3 4] [5 6]]
ลองเลือกองค์ประกอบเฉพาะจากอาร์เรย์ เช่น องค์ประกอบที่มีดัชนีแถว [0, 1, 2] และดัชนีคอลัมน์ [1, 0, 1] จาก ndarray หลายมิติ:
import numpy as np arr = np.array([[1,2],[3,4],[5,6]]) s = arr[[0, 1, 2], [1, 0, 1]] print(s)
ผลลัพธ์
[2 3 6]
การเลือกด้วยดัชนี 0 จะให้คุณแถวแรก:
>> arr = np.array([[1,2],[3,4],[5,6]]) >>> print(arr[0]) [1 2]
เช่นเดียวกัน เราสามารถเลือกรายการเดียวจากอาร์เรย์ได้ เช่น เลือก 1 เป็นดัชนีแถวและ 1 เป็นดัชนีคอลัมน์ ซึ่งให้ค่าอาร์เรย์ 4
>> print(arr[[1], [1]]) [4]
เราสามารถดำเนินการคณิตศาสตร์ เช่น การบวกและคืนค่าของดัชนีเฉพาะหลังจากดำเนินการบวก:
>> print(arr[[1], [1]] + 1) [5]
ตามที่เห็น ค่าดัชนีเพิ่มขึ้น 1 แต่อาร์เรย์จริงยังคงเหมือนเดิม:
>> arr array([[1, 2], [3, 4], [5, 6]])
แต่เราสามารถเปลี่ยนค่าของอาร์เรย์และคืนค่าสำเนาใหม่ของอาร์เรย์:
>> arr[[1], [1]] += 1 >>> arr array([[1, 2], [3, 5], [5, 6]])
Boolean Indexing (การจัดดัชนีบูลีน)
เราใช้ boolean indexing เมื่อผลลัพธ์จะเป็นผลลัพธ์ของการดำเนินการบูลีน
>> arr = np.array([[0,1,2], [3,4,5], [6,7,8], [9,10,11]])
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
คืนค่าที่มีค่าเป็น 1:
>> arr[arr == 1] array([1])
คืนค่าที่เป็นเลขคู่:
>> arr[arr % 2 == 0] array([ 0, 2, 4, 6, 8, 10])