2012-11-09 24 views
21

मुझे यह त्रुटि संदेश क्यों मिलता है? ValueError: एक अनुक्रम के साथ एक सरणी तत्व सेटिंग। धन्यवादNumpy ValueError: अनुक्रम के साथ एक सरणी तत्व सेट करना। यह संदेश अनुक्रम के मौजूदा के बिना प्रकट हो सकता है?

Z=np.array([1.0,1.0,1.0,1.0]) 

def func(TempLake,Z): 
    A=TempLake 
    B=Z 
    return A*B 

Nlayers=Z.size 
N=3 
TempLake=np.zeros((N+1,Nlayers)) 

kOUT=np.zeros(N+1) 
for i in xrange(N): 
    kOUT[i]=func(TempLake[i],Z) 

उत्तर

36

आप क्योंकि आप एक दृश्य के साथ एक सरणी तत्व स्थापित करने के लिए कोशिश कर रहे हैं त्रुटि संदेश

ValueError: setting an array element with a sequence. 

हो रही है। मैं प्यारा होने की कोशिश नहीं कर रहा हूं, त्रुटि संदेश आपको यह बताने की कोशिश कर रहा है कि समस्या क्या है। इसे एक गुप्त त्रुटि के रूप में मत सोचो, यह बस एक वाक्यांश है। समस्या क्या समस्या दे रही है?

kOUT[i]=func(TempLake[i],Z) 

इस लाइन जो कुछ func(TempLAke[i], Z) रिटर्न के लिए kOUT की ith तत्व स्थापित करने के लिए कोशिश करता है। i=0 मामले को देखते हुए:

In [39]: kOUT[0] 
Out[39]: 0.0 

In [40]: func(TempLake[0], Z) 
Out[40]: array([ 0., 0., 0., 0.]) 

आप kOUT[0] जो केवल एक नाव है में एक 4 तत्व सरणी लोड करने के लिए कोशिश कर रहे हैं। इसलिए, आप एक अनुक्रम (दाईं ओर, func(TempLake[i], Z)) के साथ एक सरणी तत्व (बाएं हाथ की ओर, kOUT[i]) सेट करने का प्रयास कर रहे हैं।

शायद func जो भी आप चाहते हैं वह नहीं कर रहा है, लेकिन मुझे यकीन नहीं है कि आप वास्तव में क्या करना चाहते थे (और यह न भूलें कि आप आम तौर पर अस्थिर में लूपिंग के बजाय ए * बी जैसे वेक्टरीकृत ऑपरेशंस का उपयोग कर सकते हैं।) वैसे भी समस्या की व्याख्या करनी चाहिए।

+17

मैंने पाया संदेश गुप्त भी है। – SherylHohman

+2

इस संदेश को बदलने के बारे में numpy के github (https://github.com/numpy/numpy/issues/6584) पर चर्चा की गई विभिन्न स्थितियों का बेहतर वर्णन करने के लिए चर्चा है। जॉनी वोंग के जवाब ने नीचे बताया कि मेरे मामले में क्या हो रहा था। – SherylHohman

+1

मैं यह कहना चाहता हूं कि व्हाट अनुक्रम द्वारा कौन सा तत्व सेट किया गया है। इसका जिक्र नहीं है इसका कोई उपयोग नहीं है। – Louis

3

मेरा मानना ​​है कि पाइथन एरे सिर्फ मान मानते हैं। तो यह सूची में कन्वर्ट:

kOUT = np.zeros(N+1) 
kOUT = kOUT.tolist() 
16

ऐसा नहीं है कि जवाब में से दोनों समस्या यह पता लगाने, लेकिन यह हल करने के लिए एक निष्कर्ष नहीं दिया एक दया है। चलिए कोड देखें।

Z = np.array([1.0, 1.0, 1.0, 1.0]) 

def func(TempLake, Z): 
    A = TempLake 
    B = Z 
    return A * B 
Nlayers = Z.size 
N = 3 
TempLake = np.zeros((N+1, Nlayers)) 
kOUT = np.zeros(N + 1) 

for i in xrange(N): 
    # store the i-th result of 
    # function "func" in i-th item in kOUT 
    kOUT[i] = func(TempLake[i], Z) 

त्रुटि दिखाता है आप Kout के ith आइटम सेट है कि: एक सरणी में (dtype पूर्णांक), kout में हर आइटम सिर्फ एक पूर्णांक आइटम है, अन्य डेटाप्रकार को इंगित नहीं कर सकते, तो आप बयान बदलना चाहिए KOUT के डेटाटाइप को बदलने के लिए। उदाहरण के लिए, जैसे:

बदलें बयान नीचे:

kOUT = np.zeros(N + 1) 

में:

kOUT = np.zeros(N + 1, dtype=object) 

या:

kOUT = np.zeros((N + 1, N + 1)) 

सभी कोड:

import numpy as np 
Z = np.array([1.0, 1.0, 1.0, 1.0]) 

def func(TempLake, Z): 
    A = TempLake 
    B = Z 
    return A * B 

Nlayers = Z.size 
N = 3 
TempLake = np.zeros((N + 1, Nlayers)) 

kOUT = np.zeros(N + 1, dtype=object) 
for i in xrange(N): 
    kOUT[i] = func(TempLake[i], Z) 

आशा है कि यह आपकी मदद कर सके।

-1

KOUT [i] एक सूची का एक तत्व है। लेकिन आप इस तत्व को एक सूची असाइन कर रहे हैं। आपका func एक सूची उत्पन्न कर रहा है।

1
Z=np.array([1.0,1.0,1.0,1.0]) 

def func(TempLake,Z): 
    A=TempLake 
    B=Z 
    return A*B 
Nlayers=Z.size 
N=3 
TempLake=np.zeros((N+1,Nlayers)) 
kOUT=np.vectorize(func)(TempLake,Z) 

यह बजाय पाशन के भी काम करता है, के लिए, बस vectorize तथापि scipy प्रलेखन से नोट नीचे पढ़ें: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

vectorize समारोह प्रदर्शन के लिए नहीं, मुख्य रूप से सुविधा के लिए प्रदान किया गया है। कार्यान्वयन अनिवार्य रूप से लूप के लिए है।

यदि ओटीप्स निर्दिष्ट नहीं है, तो पहले तर्क के साथ फ़ंक्शन पर कॉल का उपयोग आउटपुट की संख्या निर्धारित करने के लिए किया जाएगा। फ़ंक्शन को दो बार कॉल करने से रोकने के लिए कैश सही है, तो इस कॉल के परिणाम कैश किए जाएंगे। हालांकि, कैश को लागू करने के लिए, मूल फ़ंक्शन को लपेटा जाना चाहिए जो बाद की कॉल को धीमा कर देगा, इसलिए यदि आपका कार्य महंगा है तो केवल यह करें।

kOUT=np.zeros(N+1) 

लिए:

kOUT=np.asarray([None]*(N+1)) 

या:

0

एक दृश्य या एक numpy सरणी में एक और numpy सरणी में कहें, बस इस लाइन को बदलने

kOUT=np.zeros((N+1), object)