python中的numpy数组字典

2024-04-24 00:06:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个空numpy数组的数据结构

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数组的字典列表?你知道吗


Tags: numpy数据结构列表字典foobar数组arange
1条回答
网友
1楼 · 发布于 2024-04-24 00:06:25

如果我定义一个简单的类,比如:

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>}

因为我没有定义reprstr,所以打印显示不是很有趣

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数组子类,允许您使用属性名称访问数据类型字段

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')])

在这里,我将字段定义为taking object 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语法访问字段。你知道吗

相关问题 更多 >