2016-09-12 3 views
3

я собирался создать матрицу, как:Есть ли 2D-словарь в python?

33 12 23 42 11 32 43 22 
33 − 1 1 1 0 0 1 1 
12 1 − 1 1 0 0 1 1 
23 1 1 − 1 1 1 0 0 
42 1 1 1 − 1 1 0 0 
11 0 0 1 1 − 1 1 1 
32 0 0 1 1 1 − 1 1 
43 1 1 0 0 1 1 − 1 
22 1 1 0 0 1 1 1 − 

Я хочу запросить по горизонтали или по вертикали названия, так что я создал матрицу:

a = np.matrix('99 33 12 23 42 11 32 43 22;33 99 1 1 1 0 0 1 1;12 1 99 1 1 0 0 1 1;23 1 1 99 1 1 1 0 0;42 1 1 1 99 1 1 0 0;11 0 0 1 1 99 1 1 1;32 0 0 1 1 1 99 1 1;43 1 1 0 0 1 1 99 1;22 1 1 0 0 1 1 1 99') 

Я хочу иметь определенные данные, если Я запрашиваю a [23] [11] = 1

так что мы можем создать 2D-словарь, чтобы [23] [11] = 1?

Благодаря

+1

По 2D-словарю вы имеете в виду вложенный словарь на одну градус/глубину? –

+0

Вы можете использовать 'defaultdict (dict)' или просто написать 'dict' с целыми ключами и значениями' dict' – inspectorG4dget

+0

@MosesKoledoye Большое вам спасибо за ответ! не могли бы вы дать мне пример, который я могу сказать, является ли это ответом? –

ответ

3

Вы явно просите что-то за пределами numpy.

defauldict с default_factory как dict дает ощущение словаря 2D вы хотите:

>>> from collections import defaultdict 
>>> a = defaultdict(dict) 
>>> a[23][11] = 1 
>>> a[23] 
{11: 1} 
>>> a[23][11] 
1 
+0

Эй, могу я спросить, какой должен быть формат« dict »? –

+0

@Condo_programmer Как вы хотите, хотите привести пример? –

+0

да пожалуйста! Спасибо большое! –

0

Если я правильно понимаю, вы просто хотите, чтобы пометить ваши строки/столбцы. Чтобы оставаться внутри рамки массива numpy, простым решением было бы создать сопоставление между метками и порядком массива. Я также собираюсь предположить, что это нормально, чтобы преобразовать метки в строки, поскольку они могут быть чем угодно (хотя целые числа также будут точными).

l = {str(x) : ind for ind , x in enumerate((33,12,23,42,11,32,43,22))} 
a = sp.linalg.circulant([99,1,1,1,0,0,1,1]) 
a[l['32'],l['23']] 
1

Вы ищете словарь с парами в качестве ключей?

d = {} 
d[33, 12] = 1 
d[33, 23] = 1 
# etc 

Обратите внимание, что в питоне d[a, b] это просто синтаксический сахар для d[(a, b)]

1

Другая возможность состоит в том, чтобы использовать кортежи в качестве словаря ключей

dict((33,12):1, (23,12):1, ...] 

scipy.sparse имеет разреженный формат матрицы, который хранит его значения в такой словарь. С вашими значениями такая матрица будет представлять собой матрицу 50x50, в основном 0 значений, и только 1 в этих выбранных координатах.

Имейте в виду, что ключи словаря (обычный, по крайней мере) не упорядочиваются

Что собираются делать с этими данными? Словарь, будь то тип или вложенный, хорош для одного вида использования, но плохо для других. Матрица, такая как образец, лучше для других вещей, таких как операции вдоль строк или столбцов. Формат словаря в значительной степени скрывает такую ​​упорядоченную компоновку.

Смежные вопросы