अजगर सुन्न 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

मैं एक ही समस्या में था जब wT * X को हल करना, जब यह np.dot (wT, X) होना चाहिए
जुआन ज़मोरा

X * y तत्व वार गुणा करता है
विक्टर ज़ुआनाज़ी

जवाबों:


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), लेकिन यदि आप मैट्रिक्स से प्रसारण scalars की कोशिश कर रहे yपर Xतो आप करने की आवश्यकता X * 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

यह संभव है कि त्रुटि डॉट उत्पाद में न हो, लेकिन बाद में। उदाहरण के लिए यह कोशिश करो

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 (ए, बी) ठीक हो जाएगा; हालाँकि, np.dot (a, b) * c स्पष्ट रूप से गलत है (12x1 X 1x5 = 12x5 जो तत्व-वार 5x12 को गुणा नहीं कर सकता है) लेकिन सुपी आपको देगा

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

त्रुटि भ्रामक है; हालाँकि उस लाइन पर एक मुद्दा है।


1
त्रुटि संदेश वास्तव में भ्रामक है, क्योंकि यह तब प्रतीत होता है जब आपके मैट्रिक्स आयाम तत्व-वार गुणन के लिए गलत होते हैं।
आंग हेटेट


7

आप ढूंढ रहे हैं np.matmul(X, y)। पायथन 3.5+ में आप उपयोग कर सकते हैं X @ y


0

हम खुद को भ्रमित कर सकते हैं कि एक * बी एक डॉट उत्पाद है।

लेकिन वास्तव में, यह प्रसारित होता है।

डॉट उत्पाद: a.dot (b)

प्रसारण:

प्रसारण शब्द से तात्पर्य है कि अंकगणित के संचालन के दौरान विभिन्न आयामों के साथ अफीम कैसे व्यवहार करती है, जो कुछ बाधाओं को जन्म देती है, छोटे सरणी को बड़े सरणी में प्रसारित किया जाता है ताकि उनके अनुरूप आकार हो।

(m, n) + - / * (1, n) → (m, n): संचालन m पंक्तियों पर लागू किया जाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.