Если я определяю простой класс, как:
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
синтаксиса.
Список словарей - хорошая идея. – drum
Несомненно, это зависит от вашего фактического использования. Простое создание массивов не является проблемой, проблема в том, как вы будете использовать их, какие алгоритмы вы хотите реализовать и т. Д. –
Поскольку все ваши массивы 'numpy.arange' имеют одинаковую длину' x': почему бы вам не сделать просто возьмите 2D-массив, где каждая строка обозначает один диапазон? – daniel451