Numpy tidak dapat mengakses kolom

Saya sedang mengerjakan proyek ML yang saya gunakan array numpy alih-alih panda untuk komputasi yang lebih cepat.

Ketika saya bermaksud melakukan bootstrap, saya ingin membuat subset kolom dari ndarray numpy.

Array numpy saya terlihat seperti ini:

np_arr =   
[(187., 14.45 , 20.22, 94.49)
(284., 10.44 , 15.46, 66.62)
(415., 11.13 , 22.44, 71.49)]

Dan saya ingin mengindeks kolom 1,3.

Saya menyimpan kolom saya dalam daftar sebagai ix = [1,3]

Namun, ketika saya mencoba melakukan np_arr[:,ix] saya mendapatkan pesan kesalahan yang mengatakan too many indices for array .

Saya juga menyadari bahwa ketika saya mencetak np_arr.shape saya hanya mendapatkan (3,), padahal saya mungkin ingin (3,4).

Bisakah Anda memberi tahu saya cara memperbaiki masalah saya.

Terima kasih!

Sunting:

Saya membuat objek numpy dari kerangka data pandas saya seperti ini:

def _to_numpy(self, data):
        v = data.reset_index()
        np_res = np.rec.fromrecords(v, names=v.columns.tolist())
        return(np_res)

person Shubhankar Agrawal    schedule 25.03.2020    source sumber
comment
apa dtype itu?   -  person hpaulj    schedule 25.03.2020
comment
Ini numpy.record. Saya sebenarnya mencoba mengonversi pandas df ke array np tetapi saya ingin mempertahankan nama kolomnya juga. Jadi saya menggunakan fungsi np.rec.fromrecords.   -  person Shubhankar Agrawal    schedule 25.03.2020
comment
Akses kolom berdasarkan nama bidang, bukan nomor. Ini adalah array terstruktur.   -  person hpaulj    schedule 25.03.2020


Jawaban (2)


Anda telah membuat larik rekaman (juga disebut larik terstruktur). Hasilnya adalah array 1d dengan kolom (bidang) bernama.

Menggambarkan:

In [426]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A','B','C'])                 
In [427]: df                                                                                   
Out[427]: 
   A   B   C
0  0   1   2
1  3   4   5
2  6   7   8
3  9  10  11
In [428]: arr = df.to_records()                                                                
In [429]: arr                                                                                  
Out[429]: 
rec.array([(0, 0,  1,  2), (1, 3,  4,  5), (2, 6,  7,  8), (3, 9, 10, 11)],
          dtype=[('index', '<i8'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
In [430]: arr['A']                                                                             
Out[430]: array([0, 3, 6, 9])
In [431]: arr.shape                                                                            
Out[431]: (4,)

Saya yakin to_records memiliki parameter untuk menghilangkan bidang indeks.

Atau dengan metode Anda:

In [432]:                                                                                      
In [432]: arr = np.rec.fromrecords(df, names=df.columns.tolist())                              
In [433]: arr                                                                                  
Out[433]: 
rec.array([(0,  1,  2), (3,  4,  5), (6,  7,  8), (9, 10, 11)],
          dtype=[('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
In [434]: arr['A']            # arr.A also works                                                                 
Out[434]: array([0, 3, 6, 9])
In [435]: arr.shape                                                                            
Out[435]: (4,)

Dan akses multibidang:

In [436]: arr[['A','C']]                                                                       
Out[436]: 
rec.array([(0,  2), (3,  5), (6,  8), (9, 11)],
          dtype={'names':['A','C'], 'formats':['<i8','<i8'], 'offsets':[0,16], 'itemsize':24})

Perhatikan bahwa str menampilkan array ini

In [437]: print(arr)                                                                           
[(0,  1,  2) (3,  4,  5) (6,  7,  8) (9, 10, 11)]

menampilkan daftar tupel, sama seperti np_arr Anda. Setiap tupel adalah 'catatan'. Tampilan repr juga menampilkan dtype.

Anda tidak dapat memiliki keduanya, mengakses kolom berdasarkan nama, atau membuat array numpy biasa dan mengakses kolom berdasarkan nomor. Akses bernama/catatan paling masuk akal ketika kolom merupakan campuran dari tipe-d - string, int, float. Jika semuanya mengambang, dan Anda ingin melakukan penghitungan antar kolom, lebih baik menggunakan tipe d numerik.

In [438]: arr = df.to_numpy()                                                                  
In [439]: arr                                                                                  
Out[439]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
person hpaulj    schedule 25.03.2020

Alasan masalah Anda di sini adalah karena np_arr yang Anda miliki adalah array 1-D. Bagikan juga cuplikan kode Anda sehingga dapat diketahui apa sebenarnya masalahnya. Namun secara umum, saat menangani array numpy 2-D, kami biasanya melakukan ini.

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

Ini contoh kecilnya

person Neelansh Sahai    schedule 25.03.2020
comment
Saya telah mengedit posting saya dengan kode tempat saya membuat objek. - person Shubhankar Agrawal; 25.03.2020