Как назначить каждую строку в массиве NumPy в ключи в словаре Python - PullRequest
0 голосов
/ 03 октября 2019

У меня довольно большой массив numpy. Я хотел бы взять каждую строку в моем массиве и назначить ее в качестве ключа в словаре, который я создал. Например, у меня есть короткий двумерный массив:

my_array = [[5.8 2.7 3.9 1.2]
            [5.6 3.  4.5 1.5]
            [5.6 3.  4.1 1.3]]

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

my_dict = {[5.8 2.7 3.9 1.2]:,
            [5.6 3.  4.5 1.5]:,
            [5.6 3.  4.1 1.3]:}

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы должны будете поместить некоторый заполнитель для значений, None часто используется, чтобы ничего не значить. Вам также нужно преобразовать строки во что-то хэшируемое;tuple s - очевидный выбор.

my_array = np.arange(15).reshape(3,5)

import numpy.lib.recfunctions as nlr

dict.fromkeys(nlr.unstructured_to_structured(my_array).tolist())
# {(0, 1, 2, 3, 4): None, (5, 6, 7, 8, 9): None, (10, 11, 12, 13, 14): None}

unstructured_to_structured - это маленький трюк, который объединяет каждый ряд my_array вместе, используя компунд dtype. tolist преобразует эти составные элементы в кортежи.

Если вы предпочитаете другой заполнитель вместо None, вы можете указать это в качестве второго аргумента для dict.fromkeys. (Не используйте изменяемый заполнитель, потому что все значения будут ссылками на один и тот же объект.)

1 голос
/ 03 октября 2019

Если кортеж подойдет, тогда:

import numpy as np

my_array = np.array([[5.8, 2.7, 3.9, 1.2],
                     [5.6, 3., 4.5, 1.5],
                     [5.6, 3., 4.1, 1.3]])


d = { k : None for k in map(tuple, my_array)}

print(d)

Выход

{(5.8, 2.7, 3.9, 1.2): None, (5.6, 3.0, 4.5, 1.5): None, (5.6, 3.0, 4.1, 1.3): None}

В качестве альтернативы вы можете сделать:

d = { tuple(row) : None for row in my_array}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...