2016-10-09 4 views
0

Я хочу, чтобы создать структуру данных пустого NumPy массива нечто такого рода:словарь Numpy массива в Python

d[1].foo = numpy.arange(x) 
d[1].bar = numpy.arange(x) 
d[2].foo = numpy.arange(x) 
d[2].bar = numpy.arange(x) 

Что бы лучший вариант ... список словарей, содержащих Numpy массивы?

+0

Список словарей - хорошая идея. – drum

+0

Несомненно, это зависит от вашего фактического использования. Простое создание массивов не является проблемой, проблема в том, как вы будете использовать их, какие алгоритмы вы хотите реализовать и т. Д. –

+0

Поскольку все ваши массивы 'numpy.arange' имеют одинаковую длину' x': почему бы вам не сделать просто возьмите 2D-массив, где каждая строка обозначает один диапазон? – daniel451

ответ

1

Если я определяю простой класс, как:

class MyObj(object): 
    pass 
    . 

Я мог бы создать словарь с несколькими из этих объектов:

In [819]: d={1:MyObj(), 2:MyObj()} 

, а затем назначить атрибуты для каждого объекта

In [820]: d[1].foo=np.arange(3) 
In [821]: d[1].bar=np.arange(3) 
In [822]: d[2].foo=np.arange(3) 
In [823]: d[2].bar=np.arange(3) 
In [824]: d 
Out[824]: {1: <__main__.MyObj at 0xaf20cfac>, 2: <__main__.MyObj at 0xaf20c4cc>} 

Поскольку я не определил repr или str, то отобразится не очень интересно;

In [825]: vars(d[2]) 
Out[825]: {'bar': array([0, 1, 2]), 'foo': array([0, 1, 2])} 

Я также мог бы сделал список с этими объектами

In [826]: dl = [None, d[1], d[2]] 
In [827]: dl 
Out[827]: [None, <__main__.MyObj at 0xaf20cfac>, <__main__.MyObj at 0xaf20c4cc>] 
In [828]: vars(dl[1]) 
Out[828]: {'bar': array([0, 1, 2]), 'foo': array([0, 1, 2])} 

Так как список и словарь могут быть проиндексированы (так может массиву); но синтаксис .foo используется для доступа к атрибутам объекта.

===============

Совершенно иной способ создания структуры с этим видом доступа является использование recarray - это подкласс NumPy массив, который позволяет вы для доступа DTYPE полей с именами атрибутов

In [829]: R=np.recarray((3,), dtype=[('foo','O'),('bar','O')]) 
In [830]: R 
Out[830]: 
rec.array([(None, None), (None, None), (None, None)], 
      dtype=[('foo', 'O'), ('bar', 'O')]) 
In [831]: R[1].foo=np.arange(3) 
In [832]: R[2].bar=np.arange(4) 
In [833]: R 
Out[833]: 
rec.array([(None, None), (array([0, 1, 2]), None), (None, array([0, 1, 2, 3]))], 
      dtype=[('foo', 'O'), ('bar', 'O')]) 

Здесь я определил поля как взятие объекта DTYPE, который позволяет мне присвоить что-либо, в том числе и другие массивы для каждого атрибута. Но обычно dtype является чем-то более конкретным, как int, float, string.

можно просмотреть foo атрибут/поле для всех элементов в массиве R:

In [834]: R.foo 
Out[834]: array([None, array([0, 1, 2]), None], dtype=object) 
In [835]: R['bar'] 
Out[835]: array([None, None, array([0, 1, 2, 3])], dtype=object) 

recarray имеет специальный метод, который позволяет получить доступ к полям с помощью attribute синтаксиса.

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