Подтвердить что ты не робот

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

4b9b3361

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