создать структурированный массив NumPy в Python со строками и Int - PullRequest
0 голосов
/ 01 июля 2018

у меня есть это:

>>> matriz
      [['b8:27:eb:d6:e3:10', '0.428s', '198'],
      ['b8:27:eb:d6:e3:10', '0.428s', '232'],
      ['b8:27:eb:07:65:ad', '0.796s', '180'], 
      ['b8:27:eb:07:65:ad', '0.796s', '255'],
      dtype='<U17']`

но мне нужен столбец

   `matriz[:, [2]] : 
    [['198'],
     ['232'],
     ['180'], 
     ['255']]` 

, чтобы быть int, а другие столбцы, чтобы быть строками, я пытался с структурированным массивом Numpy, но у меня есть это сообщение об ошибке,

 ValueError: invalid literal for int() with base 10: 'b8:27:eb:d6:e3:10'
 TypeError: a bytes-like object is required, not 'str'

я использовал

  matriz=np.array(matriz, dtype='U17,U17,i4')

Я использую NumPy версию '1.12.1' для Raspberry Pi 3, я не знаю, что я делаю неправильно. большое спасибо

Ответы [ 2 ]

0 голосов
/ 01 июля 2018
In [484]: x = np.array([['b8:27:eb:d6:e3:10', '0.428s', '198'],
     ...:               ['b8:27:eb:d6:e3:10', '0.428s', '232'],
     ...:               ['b8:27:eb:07:65:ad', '0.796s', '180'], 
     ...:               ['b8:27:eb:07:65:ad', '0.796s', '255']],
     ...:              dtype='<U17')
     ...:              

Вы можете получить последний столбец с преобразованием astype:

In [485]: x[:,2].astype(int)
Out[485]: array([198, 232, 180, 255])
In [486]: x[:,[2]].astype(int)
Out[486]: 
array([[198],
       [232],
       [180],
       [255]])

Чтобы построить структурированный массив, вам нужно предоставить список кортежей. Список списков или неструктурированный массив с составным dtype приведёт к вашему типу ошибки.

In [487]: np.array([tuple(i) for i in x],'U17,U10,int')
Out[487]: 
array([('b8:27:eb:d6:e3:10', '0.428s', 198),
       ('b8:27:eb:d6:e3:10', '0.428s', 232),
       ('b8:27:eb:07:65:ad', '0.796s', 180),
       ('b8:27:eb:07:65:ad', '0.796s', 255)],
      dtype=[('f0', '<U17'), ('f1', '<U10'), ('f2', '<i8')])
In [488]: _['f2']
Out[488]: array([198, 232, 180, 255])

Поля структурированного массива выбираются по имени.

0 голосов
/ 01 июля 2018

NumPy лучше всего работает с однородными массивами d-типа. Панды - хорошая альтернатива, если у вас разные типы.

Однако то, что вы просите, возможно с помощью структурированных массивов NumPy :

import numpy as np

x = np.array([['b8:27:eb:d6:e3:10', '0.428s', '198'],
              ['b8:27:eb:d6:e3:10', '0.428s', '232'],
              ['b8:27:eb:07:65:ad', '0.796s', '180'], 
              ['b8:27:eb:07:65:ad', '0.796s', '255']],
             dtype='<U17')

arr = np.core.records.fromarrays(x.transpose(),
                                 formats='<U17,<U17,i4',
                                 names='col1,col2,col3')

print(arr)

rec.array([('b8:27:eb:d6:e3:10', '0.428s', 198),
           ('b8:27:eb:d6:e3:10', '0.428s', 232),
           ('b8:27:eb:07:65:ad', '0.796s', 180),
           ('b8:27:eb:07:65:ad', '0.796s', 255)],
          dtype=[('col1', '<U17'), ('col2', '<U17'), ('col3', '<i4')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...