รายชื่อของรายการลงในอาร์เรย์ numpy


184

ฉันจะแปลงรายการลิสต์อย่างง่าย ๆ ให้เป็นอาเรย์ numpy ได้อย่างไร? แถวเป็นรายการย่อยแต่ละรายการและแต่ละแถวมีองค์ประกอบในรายการย่อย

คำตอบ:


199

หากรายการของคุณมีรายการที่มีองค์ประกอบแตกต่างกันไปคำตอบของ 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)

15
ขอบคุณมาที่นี่เพื่อสิ่งนี้ มีการใช้ numpy ในขณะที่และพบว่าพฤติกรรมนี้ไม่สำคัญ ขอขอบคุณที่สละเวลาอธิบายกรณีทั่วไปนี้ให้มากขึ้น
Adam Hughes

dtype=floatทำงานเกินไปก็จะแปลงNoneเป็นnp.nanซึ่งอาจเป็นประโยชน์

108
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
นี่เป็นการแปลงรายการของรายการในอาร์เรย์ 2D โดยอัตโนมัติเพราะความยาวของรายการที่รวมทั้งหมดจะเหมือนกัน คุณรู้วิธีที่จะไม่ทำเช่นนั้น: สร้างอาร์เรย์ของรายการแม้ว่ารายการทั้งหมดจะมีความยาวเท่ากันหรือไม่? หรือเป็นไปได้ที่จะแปลงอาเรย์ 2 มิติในอาเรย์ 1D ของ 1D อาเรย์ (อย่างมีประสิทธิภาพฉันหมายถึงไม่มีวิธีการทำซ้ำหรือสิ่งแผนที่หลาม)
Juh_

7
หากไม่ได้ผลสำหรับคุณเพราะรายการย่อยของคุณจะไม่ขนาดแม้กระทั่งดูคำตอบต่อไปนี้
Nikana Reklawyks

@NikanaReklawyks ฉันสับสนหลังจากดูคำตอบ แต่ความคิดเห็นของคุณมีประโยชน์ ฉันพบว่ารายการของฉันถูกขรุขระเมื่อมันไม่ควรจะเป็น
Nikhil Girraj

39

เนื่องจากนี่คือการค้นหายอดนิยมบน 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 ที่ใช้อย่างหรูหรา


12
ในขณะที่บางคนอาจมองหาสิ่งนี้ฉันค่อนข้างมั่นใจว่า OP ต้องการ nparr หลายมิติ
นาธาน

1
ฉันกำลังมองหาสิ่งนี้ :))
Pallie


6

อีกครั้งหลังจากค้นหาปัญหาของการแปลงรายการที่ซ้อนกันด้วยระดับ 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ด้วยเหตุผลบางอย่างสร้างชั้นพิเศษ - จำเป็นต้องตรวจสอบ)
Venryx

อาโอเคปัญหาในกรณีของฉันคือสำหรับ "เลเยอร์ลิสต์" ที่ลึกที่สุดลิสต์นั้นไม่ได้มีความยาวเท่ากันซึ่งทำให้np.array"ห่อ" ลิสต์ที่ลึกที่สุดเหล่านั้นแทนที่จะเปลี่ยนเป็นอาเรย์ numpy
Venryx

-2

ฉันมีรายการของความยาวเท่ากัน ยิ่งกว่านั้น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)))

1
ทำไมบนโลกนี้คุณจะยังคงซ้อนกันถ้าคุณรู้ว่าคุณมี 10 รายการทำไมไม่ np.empty ((10, 4)) แล้วเติมให้เต็ม?
เมห์

-4

เพียงแค่ใช้หมีแพนด้า

list(pd.DataFrame(listofstuff).melt().values)

ใช้งานได้กับรายการของรายการเท่านั้น

หากคุณมีรายการของรายการคุณอาจต้องการลองทำตามบรรทัด

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.