Как создать массив символов в 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

2 ответов


вы можете создать массив символов 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 (см. string docs).


На самом деле, вы можете сделать это без каких-либо копий или списков в 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 для хранения строк в большинстве случаев. Есть случаи, когда это полезно, но обычно лучше придерживаться структур данных, которые позволяют строки переменной длины для, ну, держит струны.