วิธีการแบนเฉพาะบางมิติของอาร์เรย์ตัวเลข


128

มีวิธีที่รวดเร็วในการ "sub-flatten" หรือทำให้เฉพาะบางส่วนของมิติแรกในอาร์เรย์ตัวเลข

ตัวอย่างเช่นเมื่อกำหนดขนาดอาร์เรย์จำนวนหนึ่งมิติ(50,100,25)ผลลัพธ์จะเป็น(5000,25)


1
สิ่งนี้อาจช่วยได้stackoverflow.com/questions/13990465/3d-numpy-array-to-2d
Ankur Ankan

คุณต้องมีหลักสูตรทบทวนเกี่ยวกับการแบ่งส่วนอาร์เรย์ numpy ndarray หรือที่เรียกว่าการจัดทำดัชนีอาร์เรย์แบบหลายมิติโปรดดูที่docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html อาร์เรย์ตัด ndarray ของคุณโดยใช้วงเล็บเหลี่ยมและใช้ตัวคั่นลูกน้ำเพื่อแยกว่าแต่ละส่วนมีจำนวนเท่าใด มิติที่คุณต้องการ มันจะมีลักษณะ (ไม่ตรง) สิ่งนี้: your_array[50:100, 7, :]ซึ่งทำให้วัตถุ 3 มิติแบนเป็น 2d โดยใช้เฉพาะชิ้นส่วนหมายเลข 7 สำหรับมิติที่ 2
Eric Leschinski

คำตอบ:


129

ลองดูที่numpy.reshape

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)

81

การสรุปทั่วไปเล็กน้อยสำหรับคำตอบของ Alexander - np.reshape สามารถใช้ -1 เป็นอาร์กิวเมนต์ซึ่งหมายความว่า "ขนาดอาร์เรย์ทั้งหมดหารด้วยผลคูณของมิติข้อมูลอื่น ๆ ที่ระบุไว้ทั้งหมด":

เช่นการแบนทั้งหมดยกเว้นมิติสุดท้าย:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)

33

ลักษณะทั่วไปเล็กน้อยสำหรับคำตอบของ Peter - คุณสามารถระบุช่วงเหนือรูปร่างของอาร์เรย์ดั้งเดิมได้หากคุณต้องการเกินอาร์เรย์สามมิติ

เช่นการแบนทั้งหมดยกเว้นสองมิติสุดท้าย:

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

แก้ไข: การสรุปทั่วไปเล็กน้อยสำหรับคำตอบก่อนหน้าของฉัน - แน่นอนคุณสามารถระบุช่วงที่จุดเริ่มต้นของการปรับรูปร่างได้เช่นกัน:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)

2
เป็นเวลากว่าสองปีแล้ว ... ;)
ลิ ธ

1

อีกทางเลือกหนึ่งคือใช้numpy.resize()ใน:

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.