Преобразование словаря строк в словарь numpy массивов - PullRequest
0 голосов
/ 28 мая 2020

У меня есть словарь со структурой, подобной приведенной ниже.

test_dict = {1: 'I run fast', 2: 'She runs', 3: 'How are you?'}

Я пытаюсь преобразовать все строки в массивы 4x4 numpy, где каждое слово находится в собственной строке и каждая буква занимает одну ячейку массива, заполненную пробелами для строк, которые не заполняют всю строку целую строку пробелов для предложений длиной менее 4 слов. Мне также нужно иметь возможность вернуть ie его обратно к идентификатору, поэтому результат должен быть в каком-то формате, который позволил бы в дальнейшем ссылаться на каждый массив по его идентификатору.

Я не знаю любых предварительно созданных функций, которые могут обрабатывать что-то подобное, но я был бы счастлив ошибиться. Пока я пытался написать al oop, чтобы справиться с этим. Ниже явно не все, потому что я застрял на этапе создания массива в структуре, которую я хотел бы.

for k in test_dict.keys():
    sentence = test_dict.getvalues(k)
    sentence_ascii = [ord(c) for c in sentence]
    sentence_array = np.array(sentence_ascii)

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Это вы имеете в виду?

{
    key: np.array([list(word.ljust(4)) for word in val.split()])
    for key, val in test_dict.items()
}

вывод:

{1: array([['I', ' ', ' ', ' '],
           ['r', 'u', 'n', ' '],
           ['f', 'a', 's', 't']], dtype='<U1'),
 2: array([['S', 'h', 'e', ' '],
           ['r', 'u', 'n', 's']], dtype='<U1'),
 3: array([['H', 'o', 'w', ' '],
           ['a', 'r', 'e', ' '],
           ['y', 'o', 'u', '?']], dtype='<U1')}
0 голосов
/ 29 мая 2020

Вы можете использовать это для вызова ваших массивов с использованием поля 'ID':

dt=[('ID', '<i4'), ('sentences', object)]
new_dict = np.empty(len(test_dict), dtype=dt)
for i, (k, v) in enumerate(test_dict.items()):
  new_dict[i] = (k, np.pad(np.array([list("{:<4}".format(w)) for w in v.split(' ')]).view(np.int32), [(0,4-len(v.split(' '))),(0,0)]))

пример вывода:

print(new_dict[new_dict['ID']==2]['sentences'])

[array([[ 83, 104, 101,  32],
   [114, 117, 110, 115],
   [  0,   0,   0,   0],
   [  0,   0,   0,   0]], dtype=int32)]
0 голосов
/ 28 мая 2020

Это обеспечит наличие пустых строк для предложений длиной менее четырех слов.

new_dict = {i+1:np.empty((4,4),dtype='str') for i in range(len(test_dict))}
for k,v in test_dict.items():
    new_dict[k][:len(v.split())] = np.array([list(s)+['']*(4-len(s)) for s in v.split()])
    new_dict[k] = new_dict[k].view(np.int32)
...