python numpy ValueError: ไม่สามารถออกอากาศตัวถูกดำเนินการร่วมกับรูปร่างได้


129

ใน numpy ฉันมี "อาร์เรย์" สองตัวXคือ(m,n)และyเป็นเวกเตอร์(n,1)

การใช้

X*y

ฉันได้รับข้อผิดพลาด

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

(97,2)x(2,1)การดำเนินการเมทริกซ์กฎหมายชัดเจนเมื่อ ใดและควรให้(97,1)เวกเตอร์แก่ฉัน

แก้ไข:

ฉันได้แก้ไขโดยใช้X.dot(y)แต่คำถามเดิมยังคงอยู่


2
"คำถามเดิม" คืออะไร? X*yไม่ควรทำงาน (และไม่ได้) แต่np.dot(X,y)และX.dot(y))ควรจะทำงาน (และสำหรับฉันที่พวกเขาทำ)
DSM

3
*ไม่ใช่การคูณเมทริกซ์สำหรับndarrayวัตถุ
user2357112 รองรับ Monica

ฉันพบปัญหาเดียวกันเมื่อแก้ wT * X เมื่อนี่ควรเป็น np.dot (wT, X)
Juan Zamora

X * y ทำการคูณองค์ประกอบอย่างชาญฉลาด
Victor Zuanazzi

คำตอบ:


93

dotคือการคูณเมทริกซ์ แต่*ทำอย่างอื่น

เรามีสองอาร์เรย์:

  • X, รูปร่าง (97,2)
  • y, รูปร่าง (2,1)

ด้วยอาร์เรย์ Numpy การดำเนินการ

X * y

เป็นองค์ประกอบที่ชาญฉลาด แต่ค่าหนึ่งหรือทั้งสองค่าสามารถขยายได้ในมิติเดียวหรือมากกว่าเพื่อให้เข้ากันได้ การดำเนินการนี้เรียกว่าการกระจายเสียง ขนาดที่มีขนาด 1 หรือที่ขาดหายไปสามารถใช้ในการแพร่ภาพได้

ในตัวอย่างด้านบนมิติข้อมูลเข้ากันไม่ได้เนื่องจาก:

97   2
 2   1

มีตัวเลขที่ขัดแย้งกันในมิติแรก (97 และ 2) ที่นี่ นั่นคือสิ่งที่ ValueError ข้างต้นบ่นเกี่ยวกับ มิติที่สองก็โอเคเนื่องจากหมายเลข 1 ไม่ขัดแย้งกับสิ่งใด

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกฎการออกอากาศ: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(โปรดทราบว่าถ้าXและyเป็นประเภทnumpy.matrixคุณสามารถใช้เครื่องหมายดอกจันเป็นการคูณเมทริกซ์ได้คำแนะนำของฉันคือหลีกเลี่ยงnumpy.matrixมันมีแนวโน้มที่จะซับซ้อนมากกว่าทำให้สิ่งต่างๆง่ายขึ้น)

อาร์เรย์ของคุณควรจะใช้ได้ด้วยnumpy.dot; หากคุณได้รับข้อผิดพลาดnumpy.dotคุณต้องมีข้อบกพร่องอื่น ๆ หากรูปทรงไม่ถูกต้องnumpy.dotคุณจะได้รับข้อยกเว้นอื่น:

ValueError: matrices are not aligned

หากคุณยังคงพบข้อผิดพลาดนี้โปรดโพสต์ตัวอย่างปัญหาเล็กน้อย ตัวอย่างการคูณด้วยอาร์เรย์ที่มีรูปร่างเหมือนของคุณประสบความสำเร็จ:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)

34

ต่อจำนวนเอกสาร :

เมื่อทำงานบนอาร์เรย์สองอาร์เรย์ NumPy จะเปรียบเทียบองค์ประกอบของรูปร่างที่ชาญฉลาด เริ่มต้นด้วยมิติต่อท้ายและเคลื่อนไปข้างหน้า สองมิติเข้ากันได้เมื่อ:

  • พวกเขาเท่ากันหรือ
  • หนึ่งในนั้นคือ 1

ในคำอื่น ๆ ถ้าคุณกำลังพยายามที่จะคูณสองเมทริกซ์ (ในความรู้สึกพีชคณิตเชิงเส้น) แล้วคุณต้องการX.dot(y)แต่ถ้าคุณกำลังพยายามที่จะเกลาออกอากาศจากเมทริกซ์yบนแล้วคุณจะต้องดำเนินการ XX * y.T

ตัวอย่าง:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])

11

เป็นไปได้ว่าข้อผิดพลาดไม่ได้เกิดขึ้นใน dot product แต่หลังจากนั้น ตัวอย่างเช่นลองสิ่งนี้

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

np.dot (a, b) จะดี; อย่างไรก็ตาม np.dot (a, b) * c ผิดอย่างชัดเจน (12x1 X 1x5 = 12x5 ซึ่งไม่สามารถคูณองค์ประกอบ 5x12 ได้อย่างชาญฉลาด) แต่ numpy จะให้

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

ข้อผิดพลาดทำให้เข้าใจผิด อย่างไรก็ตามมีปัญหาในบรรทัดนั้น


1
ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดอย่างแท้จริงเนื่องจากสิ่งนี้ดูเหมือนจะปรากฏขึ้นเมื่อขนาดเมทริกซ์ของคุณไม่ถูกต้องสำหรับการคูณตามองค์ประกอบ
Aung Htet



0

เราอาจสับสนในตัวเองว่า a * b คือ dot product

แต่จริงๆแล้วมันคือการออกอากาศ

Dot Product: a.dot (b)

ออกอากาศ:

คำว่าการแพร่ภาพหมายถึงวิธีที่ numpy ปฏิบัติต่ออาร์เรย์ที่มีขนาดต่างกันในระหว่างการดำเนินการทางคณิตศาสตร์ซึ่งนำไปสู่ข้อ จำกัด บางประการอาร์เรย์ที่เล็กกว่าจะออกอากาศผ่านอาร์เรย์ขนาดใหญ่เพื่อให้มีรูปร่างที่เข้ากันได้

(m, n) + - / * (1, n) → (m, n): การดำเนินการจะใช้กับ m แถว

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