ฉันจะแปลงรายการลิสต์อย่างง่าย ๆ ให้เป็นอาเรย์ numpy ได้อย่างไร? แถวเป็นรายการย่อยแต่ละรายการและแต่ละแถวมีองค์ประกอบในรายการย่อย
ฉันจะแปลงรายการลิสต์อย่างง่าย ๆ ให้เป็นอาเรย์ numpy ได้อย่างไร? แถวเป็นรายการย่อยแต่ละรายการและแต่ละแถวมีองค์ประกอบในรายการย่อย
คำตอบ:
หากรายการของคุณมีรายการที่มีองค์ประกอบแตกต่างกันไปคำตอบของ Ignacio Vazquez-Abrams จะไม่ทำงาน มีอย่างน้อย 3 ตัวเลือกแทน:
1) สร้างอาร์เรย์ของอาร์เรย์:
x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>
2) จัดทำรายการ:
x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>
3) อันดับแรกสร้างรายการที่มีความยาวเท่ากัน:
x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>> [1, 2, 3],
>>> [1, None, None]], dtype=object)
>>> numpy.array([[1, 2], [3, 4]])
array([[1, 2], [3, 4]])
เนื่องจากนี่คือการค้นหายอดนิยมบน Google สำหรับการแปลงรายการเป็นรายการ Numpy ฉันจะเสนอสิ่งต่อไปนี้แม้คำถามจะมีอายุ 4 ปี:
>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]
เมื่อฉันคิดว่าจะทำแบบนี้ครั้งแรกฉันก็ค่อนข้างพอใจกับตัวเองเพราะมันง่ายมาก อย่างไรก็ตามหลังจากกำหนดเวลาด้วยรายการที่มีขนาดใหญ่ขึ้นจริง ๆ แล้วมันเร็วกว่าการทำเช่นนี้:
>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]
โปรดทราบว่าคำตอบ @ Bastiaan # 1 ไม่ได้สร้างรายการต่อเนื่องเพียงครั้งเดียวดังนั้นฉันจึงเพิ่ม concatenate
ไม่สามารถทำรายการอย่างต่อเนื่องเดียวด้วยเหตุนี้ฉันเพิ่ม
ยังไงก็ตาม ... ฉันชอบhstack
วิธีการของ Numpy ที่ใช้อย่างหรูหรา
มันง่ายเหมือน:
>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
[3, 4]])
อีกครั้งหลังจากค้นหาปัญหาของการแปลงรายการที่ซ้อนกันด้วยระดับ N เป็นอาร์เรย์ N มิติฉันไม่พบอะไรเลยนี่คือวิธีของฉันที่อยู่รอบ ๆ มัน:
import numpy as np
new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3
[...[...[...]]]
ส่วน คุณเพียงแค่ต้องเรียกด้วยnp.array
ndmin=number-of-list-layers
(แม้ว่าในกรณีของฉันฉันต้องการndmin=number-of-list-layers-minus-1
ด้วยเหตุผลบางอย่างสร้างชั้นพิเศษ - จำเป็นต้องตรวจสอบ)
np.array
"ห่อ" ลิสต์ที่ลึกที่สุดเหล่านั้นแทนที่จะเปลี่ยนเป็นอาเรย์ numpy
ฉันมีรายการของความยาวเท่ากัน ยิ่งกว่านั้นIgnacio Vazquez-Abrams
คำตอบก็ไม่ได้ผลสำหรับฉัน ฉันได้อาร์เรย์ numpy 1-D ที่มีองค์ประกอบเป็นลิสต์ หากคุณประสบปัญหาเดียวกันคุณสามารถใช้วิธีการด้านล่าง
ใช้ numpy.vstack
import numpy as np
np_array = np.empty((0,4), dtype='float')
for i in range(10)
row_data = ... # get row_data as list
np_array = np.vstack((np_array, np.array(row_data)))
เพียงแค่ใช้หมีแพนด้า
list(pd.DataFrame(listofstuff).melt().values)
ใช้งานได้กับรายการของรายการเท่านั้น
หากคุณมีรายการของรายการคุณอาจต้องการลองทำตามบรรทัด
lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)