Numpy matrix ไปยังอาร์เรย์


149

ฉันกำลังใช้ numpy ฉันมีเมทริกซ์ที่มี 1 คอลัมน์และแถว N และฉันต้องการรับอาร์เรย์จากองค์ประกอบ N

ตัวอย่างเช่นถ้าผมมีผมต้องการที่จะได้รับM = matrix([[1], [2], [3], [4]])A = array([1,2,3,4])

A = np.array(M.T)[0]เพื่อให้บรรลุมันผมใช้ ไม่มีใครรู้วิธีที่สง่างามมากขึ้นเพื่อให้ได้ผลลัพธ์เดียวกันหรือไม่

ขอบคุณ!


คำตอบ:


192

หากคุณต้องการให้อ่านง่ายขึ้นคุณสามารถทำสิ่งนี้ได้:

A = np.squeeze(np.asarray(M))

คุณสามารถทำได้เช่นกัน: A = np.asarray(M).reshape(-1)แต่ก็อ่านง่ายกว่านิดหน่อย


9
พูดจาโผงผางเล็ก ๆ น้อย ๆ ในส่วนของฉัน ... ทำไม numpy จึงมีอาร์เรย์และเมทริกซ์เป็นหน่วยงานที่แยกจากกัน มันเป็น IMHO ที่ไม่เน้นเสียง ขอบคุณสำหรับเคล็ดลับนี้ @Joe
Naijaba

6
@Naijaba - สำหรับสิ่งที่คุ้มค่าคลาสเมทริกซ์จะเสื่อมราคาอย่างมีประสิทธิภาพ (แต่ไม่เป็นทางการ) มันมีไว้เพื่อจุดประสงค์ทางประวัติศาสตร์เป็นส่วนใหญ่ การลบออกnumpy.matrixเป็นประเด็นที่ถกเถียงกันอยู่บ้าง แต่ผู้ที่มีหน้าที่รับผิดชอบนั้นเห็นด้วยกับคุณมากว่าการมีทั้งคู่นั้นไม่โอ้อวดและน่ารำคาญด้วยเหตุผลหลายประการ อย่างไรก็ตามจำนวนรหัสเก่าที่ไม่มีการลบ "อยู่ในสถานะเสริม" ที่ใช้matrixทำให้ยากที่จะลบออกอย่างสมบูรณ์
Joe Kington

1
ไม่ต้องพูดถึงการคูณเมทริกซ์ที่แท้จริงนั้นถูกเพิ่มสำหรับอาร์เรย์ใน Numpy 1.10 เท่านั้นและยังอยู่ในช่วงเบต้า ซึ่งหมายความว่าผู้คนจำนวนมาก (รวมถึงตัวเอง) ยังคงต้องใช้เมทริกซ์แทนอาร์เรย์เพื่อทำสิ่งที่เราต้องการ docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
การฝึกอบรมเบาบางเป็นพื้นฐานสำหรับหน่วยความจำที่มีประสิทธิภาพการเรียนรู้เครื่อง (เช่นsklearn) ในความเป็นจริงมีหลายsparse matrixประเภทในscipyซึ่งอนุญาตให้เข้าถึงอย่างมีประสิทธิภาพผ่านแถวหรือคอลัมน์ ฉันคิดว่านี่อาจเป็นปัญหาสำหรับการรวมแนวคิดของเมทริกซ์และอาร์เรย์ ที่กล่าวว่าฉันสงสัยว่าจะมีการแนะนำsparse arrayประเภทเช่นกันหรือไม่และมีแผนสำหรับการทำเช่นนั้นหรือไม่ เบาะแสใด ๆ
pms

ฉันคิดว่า. flatten () ทำงานได้ดีเท่ากับ. squeeze () ตราบใดที่คุณต้องการอาร์เรย์ 1D ในที่สุด
Wordsforthewise

122

6
ฉันคิดว่าคำตอบนี้ดีกว่าคำตอบที่ยอมรับประสิทธิภาพการทำงานและความเรียบง่าย
dariush

M.A1 นั้นยอดเยี่ยมการใช้งานแบบเดียวกับ "ravel" และ "flatten" และในกรณีนี้ไม่ทำให้เกิดการคัดลอกข้อมูลใด ๆ A จึงยังคงเชื่อมโยงกับ M ซึ่งอาจทำให้ประหลาดใจหาก A และ / หรือ M เปลี่ยนแปลงได้ M.flat ตัวสร้างทางเลือกที่กลับมา "flatiter" ของแท้ (ซีแมนติกแบบอ่านอย่างเดียว) np.squeeze (M) # ให้มุมมองในการลบขนาด 1, ตกลงที่นี่ด้วย แต่ไม่รับประกันว่าจะเป็น 1-d สำหรับ M np.reshape ทั่วไป ( M, -1) # มักจะเป็นมุมมองขึ้นอยู่กับความเข้ากันได้ของรูปร่าง "-1" นี้เป็นวิธีวงเวียนในการทำ A1 / ravel / flatten
jayprich

13
A, = np.array(M.T)

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยสง่างามฉันคิดว่า แต่นั่นคือสิ่งที่ฉันจะทำ



7
np.array(M).ravel()

ถ้าคุณสนใจความเร็ว แต่ถ้าคุณสนใจหน่วยความจำ:

np.asarray(M).ravel()

มันจะปรับปรุงคุณภาพของคำตอบของคุณถ้าคุณอธิบายว่าทำไม
มิโลวีเล


2

อันดับแรกMv = numpy.asarray(M.T)ซึ่งให้อาร์เรย์ 4x1 แต่ 2 มิติแก่คุณ

จากนั้นดำเนินการA = Mv[0,:]ซึ่งจะให้สิ่งที่คุณต้องการ numpy.asarray(M.T)[0,:]คุณสามารถใส่พวกเขาร่วมกันเป็น



0

ravel ()และฟังก์ชั่นflatten ()จาก numpy เป็นสองเทคนิคที่ฉันจะลองที่นี่ ฉันจะต้องการที่จะเพิ่มไปโพสต์ที่ทำโดยโจ , Siraj , ฟองและKevad

Ravel:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

เรียบ:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()เร็วกว่าเนื่องจากเป็นฟังก์ชันระดับไลบรารีซึ่งไม่ได้คัดลอกอาร์เรย์ อย่างไรก็ตามการเปลี่ยนแปลงใด ๆ ในอาเรย์ A จะส่งต่อไปยังอาเรย์ M ตัวเดิมหากคุณใช้งานnumpy.ravel()อยู่

numpy.flatten()numpy.ravel()จะช้ากว่า แต่ถ้าคุณใช้numpy.flatten()เพื่อสร้าง A การเปลี่ยนแปลงใน A จะไม่ถูกนำไปใช้กับอาร์เรย์ Mเดิม

numpy.squeeze()และM.reshape(-1)จะช้ากว่าและnumpy.flatten()numpy.ravel()

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.