การแปลงอาร์เรย์ NumPy เป็นโครงสร้างรายการ Python หรือไม่


คำตอบ:


427

การใช้tolist():

import numpy as np
>>> np.array([[1,2,3],[4,5,6]]).tolist()
[[1, 2, 3], [4, 5, 6]]

โปรดทราบว่าสิ่งนี้จะแปลงค่าจากประเภทใดก็ได้ที่มีอยู่ (เช่น np.int32 หรือ np.float32) เป็น "ประเภท Python ที่ใช้งานได้ใกล้เคียงที่สุด" (ในรายการ) หากคุณต้องการที่จะรักษาชนิดข้อมูล numpy คุณสามารถเรียกรายการ () บนอาร์เรย์ของคุณแทนและคุณจะจบลงด้วยรายการของสเกลา numpy (ขอบคุณ Mr_and_Mrs_D ที่ชี้ให้เห็นในความคิดเห็น)


6
หากรายการของคุณคือ float32 tolistจะแปลงเป็นfloatss - อาจไม่ต้องการ ใช้list(myarray)ไม่ได้ทนทุกข์ทรมานจากนี้ - เหตุผลที่เราควรจะเลือกtolist?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D คุณแนะนำว่าแม้จะมีโฟลตในอาเรย์ของคุณคุณต้องการให้รายการผลลัพธ์เป็นจำนวนเต็มหรือไม่ นั่นเป็นคำถามที่แตกต่างกันอย่างสิ้นเชิง ... และแน่นอนว่าคุณต้องระบุว่าแม้จะเป็นค่าลอยตัว 32 ค่าพวกเขาทั้งหมดจะถูกรวมเข้าด้วยกัน อย่างไรก็ตามหากคุณมีสถานการณ์เช่นนั้นฉันเดาว่าการทำmyarray.astype(np.int32).tolist()นั้นจะเป็นตัวเลือกและชัดเจนเกี่ยวกับสิ่งที่คุณพยายามจะทำให้สำเร็จ (และท้ายที่สุดlist(array_of_type_float32)อย่าให้จำนวนเต็มตรงนี้เมื่อฉันลอง ... ฉันไม่รู้ว่าคุณกำลังถามอะไร)
Peter Hansen

1
ฉันไม่เคยพูดถึงจำนวนเต็ม - ลองfloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D

2
โอเคดังนั้นสิ่งที่แปลงเป็น [float] และอีกอันใช้รูปแบบ numpy scalar float32 ประเภทนิ่งเหมือน [np.float32] ละเอียด. เป็นการดีที่จะรู้ แต่ฉันเดาว่ามันเป็นที่น่าพอใจหรือไม่ขึ้นอยู่กับแต่ละกรณี สำหรับสิ่งที่คุ้มค่าฉันสงสัยว่าโดยทั่วไปเมื่อมีคน (เช่น OP) ขอให้แปลงเป็นรายการพวกเขาหมายถึงรายการประเภทข้อมูล Python ปกติโดยปริยายในกรณีนี้อาจเป็นแบบลอยหรือจำนวนเต็มไม่ใช่รายการประเภทสเกลาร์แบบนัมพี . ขอบคุณที่ชี้นำสิ่งนี้: ฉันได้แก้ไขคำตอบเพื่อรวมหมายเหตุเกี่ยวกับสิ่งนั้น
ปีเตอร์แฮนเซ่น

ตามแนวเหล่านั้น: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley

11

กระบวนการ numpy .tolist สร้างรายการที่ซ้อนกันถ้ารูปร่างอาร์เรย์ numpy เป็น 2D

หากต้องการแสดงรายการแบบเรียบวิธีการด้านล่างจะใช้งานได้

import numpy as np
from itertools import chain

a = [1,2,3,4,5,6,7,8,9]
print type(a), len(a), a
npa = np.asarray(a)
print type(npa), npa.shape, "\n", npa
npa = npa.reshape((3, 3))
print type(npa), npa.shape, "\n", npa
a = list(chain.from_iterable(npa))
print type(a), len(a), a`

5

tolist()ทำงานได้ดีแม้ว่าจะเจออาเรย์ซ้อนกันแล้วให้พูดว่านุ่นDataFrame;

my_list = [0,1,2,3,4,5,4,3,2,1,0]
my_dt = pd.DataFrame(my_list)
new_list = [i[0] for i in my_dt.values.tolist()]

print(type(my_list),type(my_dt),type(new_list))


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