Numpy невозможно получить доступ к столбцам - PullRequest
0 голосов
/ 25 марта 2020

Я работаю над проектом ML, для которого я использую массивы numpy вместо pandas для более быстрых вычислений.

Когда я собираюсь bootstrap, я буду sh для подмножество столбцов из numpy ndarray.

Мой numpy массив выглядит следующим образом:

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

И я хочу проиндексировать столбцы 1,3.

Мои столбцы хранятся в списке как ix = [1,3]

Однако, когда я пытаюсь сделать np_arr [:, ix], я получаю сообщение об ошибке, сообщающее слишком много индексов для массива.

Я также понял, что когда я печатаю np_arr.shape, я получаю только (3,), тогда как я, вероятно, хочу (3,4).

Не могли бы вы сказать мне, как исправить мою проблему.

Спасибо!

Редактировать:

Я создаю свой numpy объект из моего pandas фрейма данных так:

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

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Причина вашей проблемы в том, что np_arr, который у вас есть, является одномерным массивом. Также поделитесь своим фрагментом кода, чтобы его можно было рассмотреть, как и в чем именно заключается проблема. Но в целом, когда мы имеем дело с 2-D numpy массивами, мы обычно делаем это.

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

Here is a small example

0 голосов
/ 25 марта 2020

Вы создали массив записей (также называемый структурированным массивом). В результате получается массив 1d с именованными столбцами (полями).

Для иллюстрации:

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,)

Мне кажется, to_records имеет параметр для удаления поля индекса.

Или с помощью вашего метода:

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,)

и многопользовательский доступ:

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})

Обратите внимание, что отображение str этого массива

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

показывает список кортежей, так же, как ваш np_arr. Каждый кортеж является «записью». На дисплее repr также отображается dtype.

Вы не можете использовать оба способа, либо получить доступ к столбцам по имени, либо создать обычный массив numpy и получить доступ к столбцам по номеру. Доступ по имени / записи имеет смысл, когда столбцы представляют собой смесь типов dty - string, int, float. Если они все плавающие, и вы хотите выполнять вычисления по столбцам, лучше использовать цифру c dtype.

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