Как создать массивы символов в numpy?
Скажем, у меня есть следующий массив:
import numpy as np
a = ['hello','snake','plate']
Я хочу, чтобы это превратилось в массив numpy b
, чтобы:
b[0,0] = 'h'
b[0,1] = 'e'
b[0,2] = 'l'
b[1,0] = 's'
...
Я хочу, чтобы стандартные трюки numpy работали, например, вещание, сравнение и т.д.
Как это делается? И где это в документации numpy?
Спасибо!
Uri
Ответы
Ответ 1
Вы можете создать массив символов numpy непосредственно, например:
b = np.array([ ['h','e','l','l','o'],['s','n','a','k','e'],['p','l','a','t','e'] ])
Обычные трюки с массивами работают с этим.
Если у вас есть a
и вы хотите сгенерировать b, обратите внимание, что:
list('hello') == ['h','e','l','l','o']
Итак, вы можете сделать что-то вроде:
b = np.array([ list(word) for word in a ])
Однако, если a
имеет слова неравной длины (например, ['snakes','on','a','plane']
), что вы хотите делать с более короткими словами? Вы можете заполнить их пробелами до самого длинного слова:
wid = max(len(w) for w in a)
b = np.array([ list(w.center(wid)) for w in a])
Какая string.center(width)
прокладывает пробелы, центрируя строку. Вы также можете использовать rjust
или ljust
(см. строковые документы).
Ответ 2
Собственно, вы можете сделать это без каких-либо копий или списков в numpy (оговорки о строках, отличных от длины). Просто просмотрите его как массив символов с 1 символом и измените его:
import numpy as np
x = np.array(['hello','snake','plate'], dtype=str)
y = x.view('S1').reshape((x.size, -1))
print repr(y)
Это дает:
array([['h', 'e', 'l', 'l', 'o'],
['s', 'n', 'a', 'k', 'e'],
['p', 'l', 'a', 't', 'e']],
dtype='|S1')
Вообще говоря, я бы избегал использования массивов numpy для хранения строк в большинстве случаев. Бывают случаи, когда это полезно, но вам обычно лучше придерживаться структур данных, которые допускают строки переменной длины для нужных строк.