Попытка вырезать b '' из моего массива Numpy

Поэтому у меня то, что я чувствую, очень глупые проблемы.

Я создаю массив из файла:

A1=np.loadtxt(file, dtype='a100') 

Я хочу написать этот массив после его обработки в другой файл:

 np.savetxt("Test.txt", A1, fmt=%s, delimiter=',') 

Почему он пишет b'string? Кажется, я понимаю, что он записывает его как байт, но для жизни меня не могу понять, как записать его без буквы b ''.

Я знаю, что это, наверное, что-то невероятно простое, я спускаюсь!

One Solution collect form web for “Попытка вырезать b '' из моего массива Numpy”

A1 загружается как массив байтов. Python3 использовал unicode строки по умолчанию, поэтому обычно добавляет их с помощью «b». Это нормально с print . Я немного удивлен, что это так и во время записи файла.

В любом случае, похоже, это трюк:

 A2=np.array([x.decode() for x in A1]) np.savetxt("Test.txt", A2, fmt='%s', delimiter=',') 

A2 будет иметь dtype, например dtype='<U100' .


Мой тестовый массив:

 array([b'one.com', b'two.url', b'three.four'], dtype='|S10') 

загруженный из простого текстового файла:

 one.com two.url three.four 

.decode – это строковый метод. [x.decode() for x in A1] работает для простого 1-го массива байтов. Если A1 равно 2d, итерация должна выполняться по всем элементам, а не только по строкам. А если A1 – структурированный массив, то он должен применяться к строкам внутри элементов.


Другая возможность заключается в использовании конвертера во время загрузки, поэтому вы получаете массив строк (unicode)

 In [508]: A1=np.loadtxt('urls.txt', dtype='U', converters={0:lambda x:x.decode()}) In [509]: A1 Out[509]: array(['one.com', 'two.url', 'three.four'], dtype='<U10') In [510]: np.savetxt('test0.txt',A1,fmt='%s') In [511]: cat test0.txt one.com two.url three.four 

В lib, который содержит loadtxt есть несколько функций конвертера, asbytes , asbytes_nested и asstr . Таким образом, converters также могут быть: converters={0:np.lib.npyio.asstr} .

genfromtxt обрабатывает это без converters :

  A1=np.genfromtxt('urls.txt', dtype='U') # array(['one.com', 'two.url', 'three.four'], dtype='<U10') 

Чтобы понять, почему savetxt сохраняет строки unicode, как мы хотим, но добавляет b для байтов, мы должны посмотреть на его код.

np.savetxt (работает на py3) по существу:

 fh = open(fname, 'wb') X = np.atleast_2d(X).T # make a 'fmt' that matches the columns of X (with delimiters) for row in X: fh.write(asbytes(format % tuple(row) + newline)) 

Глядя на две строки выборки (str и bytestr):

 In [617]: asbytes('%s'%tuple(['one.two'])) Out[617]: b'one.two' In [618]: asbytes('%s'%tuple([b'one.two'])) Out[618]: b"b'one.two'" 

Запись в файл 'wb' удаляет этот внешний слой из b'' , оставляя внутренний для байтовой строки. Это также объясняет, почему строки («plain» py3 unicode) записываются как «latin1» в файл.


Вы можете написать массив bytestrings напрямую, без savetxt . Например:

 A0 = array([b'one.com', b'two.url', b'three.four'], dtype='|S10') with open('test0.txt','wb') as f: for x in A0: f.write(x+b'\n') cat test0.txt one.com two.url three.four 

Строки Unicode также могут быть записаны напрямую, создавая один и тот же файл:

 A1 = array(['one.com', 'two.url', 'three.four'], dtype='<U10') with open('test1.txt','w') as f: for x in A1: f.write(x+'\n') 

Кодировка по умолчанию для такого файла encoding='UTF-8' , то же самое, что используется с 'one.com'.encode() . Эффект такой же, как и у savetxt :

 with open('test1.txt','wb') as f: for x in A1: f.write(x.encode()+b'\n') 

np.char есть .encode и .decode , которые, как представляется, работают итеративно на элементах массива.

таким образом

  np.char.decode(A1) # convert |S10 to <U10, like [x.decode() for x in A1] np.char.encode(A1) # convert <U10 to |S10 

Это работает с многомерными массивами

  np.savetxt('testm.txt',np.char.decode(A_bytes[:,None][:,[0,0]]), fmt='%s',delimiter=', ') 

С помощью структурированного массива np.char.decode должен применяться индивидуально к каждому из полей char.

  • Как я могу изменить конкретную метку строки в кадре данных Pandas?
  • Слушайте нажатие клавиши с асинхронным нажатием
  • Почему Python 3 изменился на exec, нарушив этот код?
  • Импорт GDAL с помощью cx_Freeze, Python3.4
  • Библиотека FastCGI WSGI в Python 3?
  • сопоставление переменных размеров
  • Python 3 - Zip - это итератор в кадре данных pandas
  • Workpool совместим с python3.4 на окнах?
  • PIL как масштабировать изображение по отношению к тексту, нарисованному на изображении
  • Каков хороший эквивалент python3 для распаковки автоматической кортежей в лямбда?
  • Является ли это утиная печать на Python?
  •  
    Interesting Posts for Van-Lav

    Строки из двух букв и фиксированной длины

    TypeError: элемент последовательности 0: ожидаемая строка, int found

    Pandas преобразует строку в int

    Будет ли Django хорошим выбором для веб-приложения, основанного на разрешениях?

    Google App Engine – динамически создаваемые шаблоны

    Сравнение нескольких последовательностей произвольной строки с ориентированными символами

    проблема с обработкой электронной почты с помощью python и нескольких принятых записей

    Численная матрица координат

    AttributeError: объект 'module' не имеет атрибута 'spectrogram'

    Как выполнить итерацию по двум словарям сразу и получить результат, используя значения и ключи от обоих

    Применить функцию к каждой ячейке в DataFrame

    Функция декодирования пытается кодировать Python

    Построение большого числа точек и краев в matplotlib

    Отображение OpenCV-видео в tkinter с использованием многопроцессорности

    Каково фактическое воздействие вызова socket.recv с bufsize, который не является силой 2?

    Python - лучший язык программирования в мире.