[Python] मैं जनरेटर से एक numpy सरणी कैसे बना सकता हूँ?



Answers

इस stackoverflow परिणाम के पीछे एक गूगल, मैंने पाया कि वहाँ एक numpy.fromiter(data, dtype, count) । डिफ़ॉल्ट count=-1 सभी तत्वों को पुन: प्रयोज्य से ले जाती है। इसे स्पष्ट रूप से सेट करने के लिए एक dtype आवश्यकता होती है। मेरे मामले में, यह काम किया:

numpy.fromiter(something.generate(from_this_input), float)

Question

मैं जेनरेटर ऑब्जेक्ट से एक numpy सरणी कैसे बना सकता हूं?

मुझे समस्या का वर्णन करने दें:

>>> import numpy
>>> def gimme():
...   for x in xrange(10):
...     yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

इस उदाहरण में, gimme () जनरेटर है जिसका आउटपुट मैं एक सरणी में बदलना चाहता हूं। हालांकि, सरणी कन्स्ट्रक्टर जनरेटर पर पुनरावृत्ति नहीं करता है, यह बस जनरेटर को ही स्टोर करता है। मेरा इच्छित व्यवहार यह है कि numpy.array (सूची (gimme ()) से), लेकिन मैं एक ही समय में इंटरमीडिएट सूची और अंतिम सरणी को स्मृति में रखने के मेमोरी ओवरहेड का भुगतान नहीं करना चाहता हूं। क्या कोई और जगह-कुशल तरीका है?




जबकि आप numpy.fromiter() साथ जेनरेटर से 1 डी सरणी बना सकते हैं, तो आप numpy.stack साथ जनरेटर से एनडी सरणी बना सकते हैं:

>>> mygen = (np.ones((5, 3)) for _ in range(10))
>>> x = numpy.stack(mygen)
>>> x.shape
(10, 5, 3)

यह 1 डी सरणी के लिए भी काम करता है:

>>> numpy.stack(2*i for i in range(10))
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

ध्यान दें कि numpy.stack आंतरिक रूप से जनरेटर का उपभोग कर रहा है और arrays = [asanyarray(arr) for arr in arrays] साथ एक मध्यवर्ती सूची बना रहा है arrays = [asanyarray(arr) for arr in arrays] । कार्यान्वयन here पाया जा सकता here




Links