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

ความแตกต่างระหว่าง Flatten() และ Ravel() ใน NumPy


มีหลายวิธีในการสร้างอาร์เรย์ NumPy NumPy มีสองวิธีที่แตกต่างกันในการแปลง ndarray ให้เป็นอาร์เรย์ 1 มิติ: คือการใช้เมธอด flatten() และอีกวิธีคือใช้เมธอด ravel()

ตัวอย่าง

# นำเข้าไลบรารีที่จำเป็น import numpy as np # สร้างอาร์เรย์จากลิสต์ arr = np.array([(2, 7, 3, 4), (5, 6, 9, 1)]) # ผลลัพธ์จาก flatten print(arr.flatten()) # ผลลัพธ์จาก ravel print(arr.ravel())

ผลลัพธ์

[2 7 3 4 5 6 9 1] [2 7 3 4 5 6 9 1]

จากตัวอย่างข้างต้น เราจะเห็นว่าทั้งสองฟังก์ชันคืนค่าลิสต์เดียวกัน ดังนั้นคำถามจึงเกิดขึ้นว่า ทำไมถึงมีสองเมธอดสำหรับงานเดียวกัน?

ด้านล่างคือความแตกต่างหลักระหว่างเมธอด flatten() และ ravel()

arr.ravel()

  • คืนค่าเพียง reference (การอ้างอิง) ของอาร์เรย์ต้นฉบับ

  • เมื่อแก้ไขอาร์เรย์ที่ได้ (arr) จะพบว่าค่าของอาร์เรย์ต้นฉบับก็เปลี่ยนไปด้วย

  • เนื่องจาก ravel ไม่ใช้หน่วยความจำเพิ่มเติม ravel จึงเร็วกว่า flatten()

  • Ravel เป็นฟังก์ชันระดับไลบรารี (library-level function)

arr.flatten()

  • คืนค่าสำเนา (copy) ของอาร์เรย์ต้นฉบับ

  • เมื่อแก้ไขอาร์เรย์ที่ได้ ค่าของอาร์เรย์ต้นฉบับจะไม่เปลี่ยนแปลง

  • เนื่องจาก flatten() ใช้หน่วยความจำ flatten() จึงช้ากว่า ravel() เล็กน้อย

  • เป็นเมธอดของอ็อบเจกต์ ndarray

ตัวอย่างเพิ่มเติม

# นำเข้าไลบรารีที่จำเป็น import numpy as np # สร้างอาร์เรย์ NumPy arr = np.array([(1,2,3,4),(3,1,4,2)]) # แสดงอาร์เรย์ต้นฉบับ print("Original array:\n", arr) # ตรวจสอบมิติของอาร์เรย์ (มิติ = 2) และชนิดคือ numpy.ndarray print("Dimension of original array: %d \n Type of original array: %s" % (arr.ndim, type(arr))) print("\nOutput from ravel method: \n") # แปลง nd array เป็น 1D array b_arr = arr.ravel() # Ravel ส่งผ่าน view ของอาร์เรย์ต้นฉบับไปยังอาร์เรย์ 'b_arr' print(b_arr) b_arr[0]=1000 print(b_arr) # สังเกตว่าค่าของอาร์เรย์ต้นฉบับ 'arr' ที่ arr[0][0] ก็กลายเป็น 1000 ด้วย print(arr) # ตรวจสอบมิติคือ 1 และชนิดยังคงเป็น numpy.ndarray print("Dimension of array: %d \n Type of array: %s" % (b_arr.ndim, type(b_arr))) print("\nOutput from flatten method: \n") # แปลง nd array เป็น 1D array c_arr = arr.flatten() # Flatten ส่งผ่าน copy ของอาร์เรย์ต้นฉบับไปยัง 'c_arr' print(c_arr) c_arr[0]=0 print(c_arr) # สังเกตว่าการเปลี่ยนค่า c_arr ไม่ส่งผลต่อค่าของอาร์เรย์ต้นฉบับ 'arr' print(arr) print("Dimension of array->%d \n Type of array->%s" % (c_arr.ndim, type(c_arr)))

ผลลัพธ์

Original array: [[1 2 3 4] [3 1 4 2]] Dimension of original array: 2 Type of original array:  Output from ravel method: [1 2 3 4 3 1 4 2] [1000 2 3 4 3 1 4 2] [[1000 2 3 4] [ 3 1 4 2]] Dimension of array: 1 Type of array:  Output from flatten method: [1000 2 3 4 3 1 4 2] [0 2 3 4 3 1 4 2] [[1000 2 3 4] [ 3 1 4 2]] Dimension of array->1 Type of array->