Mari kita asumsikan saya memiliki generator yang menghasilkan tuple x,y. Saya hanya ingin menyimpan semua elemen x yang dihasilkan dari generator ini. Tapi, saya ingin menggunakan file .npy untuk melakukannya.

Saya tahu bahwa jika generator saya hanya menghasilkan satu elemen per iterasi, katakanlah z, saya dapat menggunakan kode berikut untuk menyimpan elemen ini dalam file array numpy.

numpy.save('array.npy', numpy.stack(generator))

Tapi, yah, saya tidak tahu bagaimana memodifikasi baris ini untuk menyelesaikan masalah saya. Maksudku, aku tidak berpikir mungkin untuk menggunakan ini.

Tolong bisakah Anda membantu saya? Saya akan sangat menghargai bantuan apapun :) Terima kasih!

0
kakarotto 20 Mei 2020, 08:36

1 menjawab

Jawaban Terbaik

Sebuah generator:

In [406]: g = ((i,i+10) for i in range(5))                                               

Sebuah array dari itu:

In [407]: arr = np.stack(g)                                                              
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3242: 
FutureWarning: arrays to stack must be passed as a "sequence" 
type such as list or tuple. Support for non-sequence iterables 
such as generators is deprecated as of NumPy 1.16 and will raise 
an error in the future.
    if (await self.run_code(code, result,  async_=asy)):
In [408]: arr                                                                            
Out[408]: 
array([[ 0, 10],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14]])

Kolom pertama:

In [409]: arr[:,0]                                                                       
Out[409]: array([0, 1, 2, 3, 4])

Atau gunakan fromiter dengan dtype majemuk untuk membuat array terstruktur:

In [410]: g = ((i,i+10) for i in range(5))                                               
In [411]: arr = np.fromiter(g, 'i,i')                                                    
In [412]: arr                                                                            
Out[412]: 
array([(0, 10), (1, 11), (2, 12), (3, 13), (4, 14)],
      dtype=[('f0', '<i4'), ('f1', '<i4')])
In [413]: arr['f0']                                                                      
Out[413]: array([0, 1, 2, 3, 4], dtype=int32)

Hindari peringatan dengan membuat daftar dari generator:

In [414]: g = ((i,i+10) for i in range(5))                                               
In [415]: np.array(list(g))                                                              
Out[415]: 
array([[ 0, 10],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14]])

Cepat nanti Anda harus 'memastikan' generator. Generator hanya menghemat memori ketika beberapa dirantai. Array numpy menyimpan semua nilai, bukan generator atau nilai 'potensialnya'. Jadi generator tidak begitu berguna ketika target akhir adalah array.

1
hpaulj 20 Mei 2020, 06:52