มีหลายวิธีในการสร้างอาร์เรย์ numpy Numpy มีวิธีการแปลง ndarray เป็น 1Darray สองวิธี:ใช้วิธี flatten() และอีกวิธีโดยใช้วิธี ravel()
ตัวอย่าง
#Import required library, numpy import numpy as np #create an array from a list arr = np.array( [ (2, 7, 3, 4), (5, 6, 9, 1)]) #flatten_output print(arr.flatten()) #ravel_output print(arr.ravel())
ผลลัพธ์
[2 7 3 4 5 6 9 1] [2 7 3 4 5 6 9 1]
ด้านบนนี้ เราจะเห็นได้ว่าฟังก์ชันทั้งสองส่งคืนรายการเดียวกัน จึงเกิดคำถามขึ้นว่าทำไมสองวิธีสำหรับงานเดียวกัน
ด้านล่างนี้คือข้อแตกต่างที่สำคัญระหว่างวิธี flatten() และ ravel()
arr.ravel()
-
คืนค่าการอ้างอิงของอาร์เรย์ดั้งเดิมเท่านั้น
-
ในการแก้ไขอาร์เรย์ด้านบน (arr) เราจะเห็นว่าค่าของอาร์เรย์เดิมเปลี่ยนไปด้วย
-
เนื่องจากวิธี ravel นั้นใช้หน่วยความจำใด ๆ ravel จึงเร็วกว่า flatten()
-
Ravel เป็นฟังก์ชันระดับห้องสมุด
arr.flatten()
-
ส่งกลับสำเนาต้นฉบับของอาร์เรย์(arr)
-
ในการแก้ไขอาร์เรย์ด้านบน (arr) ค่าอาร์เรย์เดิมจะไม่เปลี่ยนแปลง
-
เนื่องจาก flatten() ใช้หน่วยความจำ flatten() จึงช้ากว่า ravel()
เล็กน้อย -
เป็นวิธีการของวัตถุ ndarray
ตัวอย่าง
#Import required library, numpy import numpy as np # Create a numpy array, arr arr = np.array([(1,2,3,4),(3,1,4,2)]) # Let's print the array arr print ("Original array:\n ", arr) #print(arr) # To check the dimension of array (dimension =2) and type is numpy.ndarray print ("Dimension of original array: %d \n Type of original array: %s" % (arr.ndim,type(arr))) print("\nOutput from ravel method: \n") # Convert nd array to 1D array b_arr = arr.ravel() # Ravel only passes a view of original array to array 'b_arr' print(b_arr) b_arr[0]=1000 print(b_arr) # Note here that value of original array 'arr' at also arr[0][0] becomes 1000 print(arr) # Just to check the dimension i.e. 1 and type is same numpy.ndarray print ("Dimension of array: %d \n Type of array: %s" % (b_arr.ndim,type(b_arr))) print("\nOutput from flatten method: \n") # Convert nd array to 1D array c_arr = arr.flatten() # Flatten passes copy of original array to 'c_arr' print(c_arr) c_arr[0]=0 print(c_arr) # Note that by changing value of c_arr there is no affect on value of original array '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: <class 'numpy.ndarray'> 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: <class 'numpy.ndarray'> 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-><class 'numpy.ndarray'>