Как удалить символ 'b' из ndarray, который добавлен np.genfromtxt - PullRequest
3 голосов
/ 23 апреля 2019

У меня есть текстовый файл, который содержит строки информации в виде строк, целых чисел и чисел, разделенных пробелами, например,

HIP893 23_10 7 0,028 4
HIP1074 43_20 20 0,0141 1
HIP1325 23_10 7 0.02388 5
...

Я импортировал эти данные, используя следующую строку:

data=np.genfromtxt('98_info.txt', dtype=(object, object, int,float,float))

Однако, когда я делаю это, я получаю вывод

[(b'HIP893', b'23_10', 7, 0.028, 4) 
 (b'HIP1074', b'43_20', 20, 0.0141, 1)
 (b'HIP1325', b'23_10', 7, 0.02388, 5)
  ... ]

В то время как я хотел бы, чтобы здесь не было 'b', вместо этого:

[('HIP893', '23_10', 7, 0.028, 4.0) 
 ('HIP1074', '43_20', 20, 0.0141, 1.0)
 ('HIP1325', '23_10', 7, 0.02388, 5.0)
  ... ]

Я пробовал core.defchararray в NumPy, но это дало мне строковую операцию error 'настроковый массив », я думаю, потому что мои данные - это комбинация как строк, так и чисел, может быть?

Есть ли какой-либо способ удалить символ, но сохранить данные в массиве, или, возможно, другой способ загрузить информацию, которая будет содержать строки в кавычках и цифры без них?

Если есть способ импортировать его в этой форме в виде 2d np-массива, даже лучше, но это не проблема, если нет.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Вы можете передать converters= с помощью функции, которая декодирует ваши байтовые строки, например:

convs = dict.fromkeys([0, 1], bytes.decode)
data = np.genfromtxt('98_info.txt', dtype=(object, object, int, float, float), converters=convs)

Что дает вам data из:

array([('HIP893', '23_10',  7, 0.028  , 4.),
       ('HIP1074', '43_20', 20, 0.0141 , 1.),
       ('HIP1325', '23_10',  7, 0.02388, 5.)],
      dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])
2 голосов
/ 23 апреля 2019

С вашим образцом и dtype:

In [1]: np.genfromtxt('stack55810419.txt', dtype=(object, object, int,float,floa
   ...: t))                                                                     
Out[1]: 
array([(b'HIP893', b'23_10',  7, 0.028  , 4.),
       (b'HIP1074', b'43_20', 20, 0.0141 , 1.),
       (b'HIP1325', b'23_10',  7, 0.02388, 5.)],
      dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])

С dtype=Noneencoding=None):

In [5]: np.genfromtxt('stack55810419.txt', dtype=None, encoding=None)           
Out[5]: 
array([('HIP893', 2310,  7, 0.028  , 4),
       ('HIP1074', 4320, 20, 0.0141 , 1),
       ('HIP1325', 2310,  7, 0.02388, 5)],
      dtype=[('f0', '<U7'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<i8')])

Указание типов юникода (необходимо указать размер):

In [6]: np.genfromtxt('stack55810419.txt', dtype=('U7', 'U7', int,float,float)) 
Out[6]: 
array([('HIP893', '23_10',  7, 0.028  , 4.),
       ('HIP1074', '43_20', 20, 0.0141 , 1.),
       ('HIP1325', '23_10',  7, 0.02388, 5.)],
      dtype=[('f0', '<U7'), ('f1', '<U7'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8')])

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

dtype=None безПараметр encoding вызывает это предупреждение:

/ usr / local / bin / ipython3: 1: VisibleDeprecationWarning: чтение строк Юникода без указания аргумента кодирования не рекомендуется.Установите кодировку, используйте None для системного значения по умолчанию.

В Py2 тип строки по умолчанию - bytestrings;в Py3 Unicode.genfromtxt использовал bytestrings в совместимости с py2.Но в последних версиях добавлен параметр encoding.Но, похоже, в этом преобразовании все еще есть некоторые неровности.


Возможно, поэтому я получил i8;Собственный Python int принимает подчеркивание.

In [20]: int('23_10')                                                           
Out[20]: 2310
0 голосов
/ 23 апреля 2019

строка, за которой следует b, является закодированной строкой, т.е. в bytes

Вы можете декодировать их, применяя функцию decode или просто str

newData = [(str(x) if isinstance(x,bytes) else x for x in y) for y in data]

Я думаю, вы можете преобразовать его в nparray через этот ТАК ответ

Я действительно не знаю о nparray

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...