Генератордан numpy массасын қалай жасауға болады?

Генератор объектісінен 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 (list (gimme ())), бірақ аралық тізімді және бір мезгілде соңғы жадты иемдену арқылы жады шығындарын төлегім келмейді. Экономикалық тәсілі бар ма?

117
15 дек. 15 секундта saffsd орнатыңыз . 2008-12-15 08:44 '08 at 8:44 2008-12-15 08:44
@ 4 жауаптар

Numpy массивтері олардың ұзындығын питон тізімдерінен айырмашылығы, жасау уақытында айқын көрсетілуін талап етеді. Бұл әрбір элемент үшін бос орын еске бөлінуі мүмкін. Кездейсоқ бөлу - numpy массивтерінің басты ерекшелігі: егер бұл әрекеттер тұрақты тізімдерге қарағанда әлдеқайда тез орындалса, бұл кодын кірістірілген енгізуімен біріктіріледі.

Осыны ескере отырып, сіз генератордың объектісін алуға және оны массивке айналдыруға техникалық мүмкін емес:

  • ол іске қосу кезінде қанша элементті болжауға болады:

     my_array = numpy.empty(predict_length()) for i, el in enumerate(gimme()): my_array[i] = el 
  • заттарыңызды аралық тізімде сақтауға дайын:

     my_array = numpy.array(list(gimme())) 
  • екі бірдей генераторды жасай алады, жалпы ұзындығын табу үшін алапты бірінші іске қосып, алапты инициализациялайды және әр элементті табу үшін генераторды қайта іске қосады:

     length = sum(1 for el in gimme()) my_array = numpy.empty(length) for i, el in enumerate(gimme()): my_array[i] = el 

1 - бұл сіз іздеген нәрсе. 2 тиімсіз, 3 тиімсіз (сіз генератор арқылы екі рет өтуіңіз керек).

101
15 дек. жауап shsmurfy беріледі 15 dec. 2008-12-15 09:31 '08 сағат 9: 00-де 2008-12-15 09:31

Бұл numpy.fromiter(data, dtype, count) нәтижесінің артынан бір google, numpy.fromiter(data, dtype, count) бар екенін numpy.fromiter(data, dtype, count) . Әдепкі бойынша, count=-1 барлық элементтерді қайталанатындан шығарады. Бұл dtype нақты орнатылуын талап етеді. Менің жағдайда, ол жұмыс істеді:

border=0

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

155
24 февр. жауап 24-ақпан күні берілді. 2009-02-24 06:53 '09 6:53 pm 2009-02-24 06:53

Біршама тангенше, бірақ сіздің генераторыңыз тізімді түсіну болса, нәтижені тиімдірек алу үшін numpy.where функциясын пайдалана аласыз (бұл хабарды көргенімнен кейін өз numpy.where таптым)

5
12 мая '09 в 23:33 2009-05-12 23:33 Жауап Benjamin Horstman 12 мамыр '09 23:33 2009-05-12 23:33

Сіз numpy.fromiter() функциясын пайдалана отырып, генератордан 1D массив жасай numpy.fromiter() , numpy.fromiter() функциясын қолданатын генератордан ND массивін жасауға болады:

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

Ол сондай-ақ 1D массивтерінде жұмыс істейді:

 >>> 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] . Іске асыруды мына жерден табуға болады .

3
31 авг. жауап 31 тамызда беріледі. 2017-08-31 14:33 '17 сағат 14:33 дейін 2017-08-31 14:33

тегтеріне қатысты басқа сұрақтар немесе Сұрақ қою