แปลงอาร์เรย์ 1D เป็นอาร์เรย์ 2D ในรูปแบบตัวเลข


118

ฉันต้องการแปลงอาร์เรย์ 1 มิติเป็นอาร์เรย์ 2 มิติโดยระบุจำนวนคอลัมน์ในอาร์เรย์ 2 มิติ สิ่งที่จะได้ผลเช่นนี้:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

numpy มีฟังก์ชันที่เหมือนกับฟังก์ชัน "vec2matrix" ของฉันหรือไม่ (ฉันเข้าใจว่าคุณสามารถสร้างดัชนีอาร์เรย์ 1D ได้เช่นอาร์เรย์ 2 มิติ แต่นั่นไม่ใช่ตัวเลือกในโค้ดที่ฉันมี - ฉันจำเป็นต้องทำการแปลงนี้)

คำตอบ:



44

คุณมีสองทางเลือก:

  • หากคุณไม่ต้องการรูปร่างเดิมอีกต่อไปวิธีที่ง่ายที่สุดคือกำหนดรูปร่างใหม่ให้กับอาร์เรย์

    a.shape = (a.size//ncols, ncols)

    คุณสามารถสลับa.size//ncolsตาม-1เพื่อคำนวณรูปร่างที่เหมาะสมโดยอัตโนมัติ ตรวจสอบให้แน่ใจa.shape[0]*a.shape[1]=a.sizeมิฉะนั้นคุณจะประสบปัญหาบางอย่าง

  • คุณสามารถรับอาร์เรย์ใหม่พร้อมnp.reshapeฟังก์ชั่นซึ่งส่วนใหญ่ทำงานเหมือนกับเวอร์ชันที่นำเสนอข้างต้น

    new = np.reshape(a, (-1, ncols))

    เมื่อเป็นไปได้newจะเป็นเพียงมุมมองของอาร์เรย์เริ่มต้นaหมายความว่ามีการแชร์ข้อมูล ในบางกรณีnewอาร์เรย์จะเป็น acopy แทน โปรดทราบว่าnp.reshapeยังยอมรับคำหลักorderที่เป็นทางเลือกซึ่งช่วยให้คุณสามารถเปลี่ยนจากลำดับ C หลักเป็นลำดับคอลัมน์หลักของ Fortran np.reshapeเป็นเวอร์ชันฟังก์ชันของa.reshapeวิธีการ

หากคุณไม่สามารถปฏิบัติตามข้อกำหนดได้แสดงa.shape[0]*a.shape[1]=a.sizeว่าคุณต้องสร้างอาร์เรย์ใหม่ คุณสามารถใช้np.resizeฟังก์ชั่นและผสมได้np.reshapeเช่น

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

9

ลองสิ่งที่ชอบ:

B = np.reshape(A,(-1,ncols))

คุณจะต้องแน่ใจว่าคุณสามารถหารจำนวนองค์ประกอบในอาร์เรย์ของคุณncolsได้ คุณยังสามารถเล่นตามลำดับที่ตัวเลขถูกดึงเข้ามาBโดยใช้orderคีย์เวิร์ด


4

หากจุดประสงค์เดียวของคุณคือการแปลงอาร์เรย์ 1d X เป็นอาร์เรย์ 2d ให้ทำดังนี้

X = np.reshape(X,(1, X.size))

0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)

1
จะดีกว่าถ้าคุณใส่คำอธิบายพร้อมกับรหัส
Sid

คุณช่วยอธิบายได้ไหมว่าคำตอบของคุณตอนนี้แตกต่างจากคำตอบก่อนหน้าและคำตอบอื่น ๆ ข้างต้นที่ใช้ np.reshape ได้อย่างไร
StupidWolf

0
some_array.shape = (1,)+some_array.shape

หรือรับใหม่

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

สิ่งนี้จะทำให้มิติ +1 เท่ากับการเพิ่มวงเล็บที่ด้านนอกสุด


-1

คุณสามารถใช้flatten()จากแพ็คเกจ numpy

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

เอาท์พุท:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]

AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F

1
คุณช่วยแบ่งปันรหัสของคุณได้ไหม เพราะ numpy sure มีflattenmethod: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

เปลี่ยนอาร์เรย์ 1D เป็นอาร์เรย์ 2D โดยไม่ใช้ Numpy

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.