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

a.sort, sorted(a), np.argsort(a) และ np.lexsort(b, a) ใน Python


การจัดลำดับองค์ประกอบข้อมูลในลำดับเฉพาะเป็นการดำเนินการที่ต้องการบ่อย ในการจัดเรียงองค์ประกอบในอาร์เรย์ Python ใช้ฟังก์ชันชื่อ sorted() และ array.sort()

sorted(array)

ฟังก์ชันนี้คืนค่าอาร์เรย์ที่จัดเรียงแล้วโดยไม่แก้ไขอาร์เรย์เดิม

a = [9, 5, 3, 1, 12, 6]
b = sorted([9, 5, 3, 1, 12, 6])
print("Sorted Array:\n", b)
print("Original Array:\n", a)

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

Sorted Array:
[1, 3, 5, 6, 9, 12]
Original Array:
[9, 5, 3, 1, 12, 6]

list.sort()

ฟังก์ชัน sort คืนค่าอาร์เรย์ที่จัดเรียงแล้วโดยแก้ไขอาร์เรย์ที่ส่งมา inplace ดังนั้นอาร์เรย์เดิมจึงถูกแก้ไข ตามตัวอย่างด้านล่าง

a = [9, 5, 3, 1, 12, 6]
print("Original Array:\n", a)
print("Sorted Array:\n")
a.sort()
print(a)

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

Original Array:
[9, 5, 3, 1, 12, 6]
Sorted Array:
[1, 3, 5, 6, 9, 12]

ดังนั้น sorted() ช้ากว่า sort() เพราะมันสร้างสำเนาของอาร์เรย์เดิมก่อนแล้วค่อยแก้ไข

ความต้องการการจัดเรียงที่ซับซ้อนกว่านี้ทำได้ด้วย NumPy NumPy เป็นไลบรารี Python ที่ใช้กันอย่างกว้างขวางในการประมวลผลข้อมูลทางวิทยาศาสตร์ เพราะมีฟีเจอร์ขั้นสูงมากมาย เราจะดูทั้งวิธีจัดเรียงแบบ Python ธรรมดาและ NumPy ในตัวอย่างด้านล่าง

numpy.argsort

ฟังก์ชันนี้ใน NumPy คืนค่าดัชนีของอาร์เรย์ที่จัดเรียงแล้ว แทนที่จะเป็นองค์ประกอบของอาร์เรย์ ในตัวอย่างด้านล่าง เราเอาอาร์เรย์ พิมพ์องค์ประกอบพร้อมดัชนีของแต่ละองค์ประกอบ จากนั้นใช้ฟังก์ชัน argsort ซึ่งให้ดัชนีของอาร์เรย์ที่จัดเรียงแล้วเป็นผลลัพธ์ และผลลัพธ์ก็เป็นอาร์เรย์เช่นกัน

import numpy as np

x = np.array([9, 5, 3, 1, 12, 6])
print(x)

# พิมพ์ตำแหน่งขององค์ประกอบ
for i in range(len(x)):
    print("[", i, "]", x[i])

print("\n")

# พิมพ์ดัชนีขององค์ประกอบที่จัดเรียงแล้ว
s = np.argsort(x)
print(s)

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

[ 9  5  3  1 12  6]
[ 0 ] 9
[ 1 ] 5
[ 2 ] 3
[ 3 ] 1
[ 4 ] 12
[ 5 ] 6
[3 2 1 5 0 4]

numpy.lexsort

ฟังก์ชันนี้ใช้สำหรับการจัดเรียงด้วย sort keys หลายตัวที่เกี่ยวข้องกับมากกว่าหนึ่งอาร์เรย์ ตัวอย่างเช่น เราจัดเรียงข้อมูลใน Column A ก่อน แล้วจัดเรียงค่าใน Column B ในตัวอย่างด้านล่าง เราใช้อาร์เรย์สองอาร์เรย์แทน Column A และ Column B เมื่อใช้ฟังก์ชัน lexsort() สำหรับจัดเรียงก่อนโดย Column A แล้วตามด้วย Column B เราจะได้ผลลัพธ์ของการจัดเรียงเป็นอาร์เรย์ที่มีดัชนีขององค์ประกอบใน Column A

import numpy as np

colA = [2, 5, 1, 8, 1]  # คอลัมน์แรก
colB = [9, 0, 3, 2, 0]  # คอลัมน์ที่สอง

# จัดเรียงโดย ColA แล้วตามด้วย colB
sorted_index = np.lexsort((colB, colA))
print(sorted_index)

# พิมพ์ผลลัพธ์แสดงค่าคอลัมน์เป็นคู่
print([(colA[i], colB[i]) for i in sorted_index])

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

[4 2 0 1 3]
[(1, 0), (1, 3), (2, 9), (5, 0), (8, 2)]

เห็นได้ว่าค่าต่ำสุดสองค่าใน colA คือ 1 และ 1 ที่ตำแหน่งดัชนี 2 และ 4 แต่ผลลัพธ์แสดง 4 และ 2 เป็นลำดับเพิ่มขึ้น เนื่องจากค่าที่สอดคล้องใน Column B ซึ่งคือ 0 และ 3 ก็จัดเรียงเป็น 0 ก่อน 3 ทำให้ผลลัพธ์เป็น 4 และ 2