त्रुटि "केवल लंबाई -1 सरणियों अजगर scalars में बदला जा सकता" जब समारोह एकल मान उम्मीद उठाया है, लेकिन आप एक सरणी के बजाय गुजरती हैं।
यदि आप np.int
के कॉल हस्ताक्षर को देखते हैं, तो आप देखेंगे कि यह एक मान को स्वीकार करता है, न कि सरणी। सामान्य तौर पर, यदि आप एक समारोह है कि एक सरणी में प्रत्येक तत्व के लिए एक एकल तत्व को स्वीकार करता है लागू करना चाहते हैं, तो आप np.vectorize
उपयोग कर सकते हैं:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.int(x)
f2 = np.vectorize(f)
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f2(x))
plt.show()
आप f (x) और बस पारित np.int की परिभाषा को छोड़ सकते हैं वेक्टरटाइज़ फ़ंक्शन के लिए: f2 = np.vectorize(np.int)
।
ध्यान दें कि np.vectorize
केवल एक सुविधा कार्य है और मूल रूप से लूप के लिए है। यह बड़े सरणी पर अक्षम होगा। जब भी आपको संभावना हो, वास्तव में वेक्टरीकृत फ़ंक्शंस या विधियों का उपयोग करें (जैसे astype(int)
@FFT suggests)।
मैंने आपको जवाब में हराया, लेकिन आपका निश्चित रूप से अधिक सुरुचिपूर्ण है :) – roganjosh
आह हाँ, np.vectorize मूल रूप से एक लूप भी है लेकिन यह मुझे लगता है कि यह बेहतर लगता है। :) – ayhan
क्लीनर और मैं भी तेज़ी से कल्पना करता हूं (मुझे परीक्षण करना चाहिए)। मुझे अभी भी इस तरह की चीजों के लिए numpy की जटिलताओं को सीखना है :) – roganjosh