Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การสไลซ์พื้นฐานและการจัดดัชนีขั้นสูงใน NumPy Python

การจัดดัชนีของ 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])