7

में रिकॉन्सील एनपी.फॉमिटर और बहुआयामी सरणी numpy से np.fromiter का उपयोग करना मुझे पसंद है क्योंकि यह np.array ऑब्जेक्ट्स बनाने के लिए संसाधन-आलसी तरीका है। हालांकि, ऐसा लगता है कि यह बहुआयामी सरणी का समर्थन नहीं करता है, जो काफी उपयोगी भी हैं।पायथन

import numpy as np 

def fun(i): 
    """ A function returning 4 values of the same type. 
    """ 
    return tuple(4*i + j for j in range(4)) 

# Trying to create a 2-dimensional array from it: 
a = np.fromiter((fun(i) for i in range(5)), '4i', 5) # fails 

# This function only seems to work for 1D array, trying then: 
a = np.fromiter((fun(i) for i in range(5)), 
     [('', 'i'), ('', 'i'), ('', 'i'), ('', 'i')], 5) # painful 

# .. `a` now looks like a 2D array but it is not: 
a.transpose() # doesn't work as expected 
a[0, 1] # too many indices (of course) 
a[:, 1] # don't even think about it 

मैं a एक बहुआयामी सरणी होने के लिए है, जबकि जनरेटर के आधार पर इस तरह के एक आलसी निर्माण रखने कैसे मिल सकता है?

उत्तर

8

अपने आप से, np.fromiter केवल 1 डी सरणियों के निर्माण का समर्थन करता है, और इस तरह के रूप में, यह lazily itertools.chain.from_iterable करने के लिए उपयोग करने के लिए एक iterable कि tuples/सूचियों/दृश्यों आदि एक तरीका यह कामचलाऊ समाधान के बजाय व्यक्तिगत मूल्यों निकलेगा होगा उम्मीद मूल्यों के एक 1 डी अनुक्रम में अपने जनरेटर अभिव्यक्ति के आउटपुट को 'अनपैक करें':

import numpy as np 
from itertools import chain 

def fun(i): 
    return tuple(4*i + j for j in range(4)) 

a = np.fromiter(chain.from_iterable(fun(i) for i in range(5)), 'i', 5 * 4) 
a.shape = 5, 4 

print(repr(a)) 
# array([[ 0, 1, 2, 3], 
#  [ 4, 5, 6, 7], 
#  [ 8, 9, 10, 11], 
#  [12, 13, 14, 15], 
#  [16, 17, 18, 19]], dtype=int32)