【问题标题】:Numpy array of numpy arrays with certain format具有特定格式的 numpy 数组的 numpy 数组
【发布时间】:2016-08-25 19:57:08
【问题描述】:

我想声明一个带有特定格式元素的 numpy 数组 (arr),如下所示:

dt1 = np.dtype([('sec', '<i8'), ('nsec', '<i8')])
dt2 = np.dtype([('name', 'S10'), ('value', '<i4')])

arr = np.array([('x', dtype=dt1), ('y', dtype=dt2)])

结构是这样的:

arr['x'] = elements with the format dt1 (sec and nsec)
arr['y'] = array of n elements with the format dt2 (name and value)

其中的元素应该像这样访问:

arr['x']['sec'], arr['x']['nsec'], arr['y'][0]['name'] etc.

但我收到invalid syntax 错误。 在这种情况下正确的语法是什么?

【问题讨论】:

  • 你能用文字解释一下你希望你的数组有什么结构吗?从您损坏的语法中看不出您正在尝试做什么。您希望阵列具有什么形状?你希望它的 dtype 是什么?你将如何访问它的元素?
  • 我希望结构是这样的:arr['x'] = 格式为 dt1 的元素(secnsecarr['y'] = n 元素的数组format dt2 (name and value) 里面的元素可以这样访问:arr['x']['sec'], arr['x']['nsec'], arr['y'][0]['name'] 等等。可以这样表示吗?或者有解决办法吗?
  • 将该描述放在您的问题中,格式清晰。

标签: python arrays numpy syntax


【解决方案1】:

双重复合数据类型可能有效:

In [834]: dt1 = np.dtype([('sec', '<i8'), ('nsec', '<i8')])
     ...: dt2 = np.dtype([('name', 'S10'), ('value', '<i4')])
     ...: 
In [835]: dt = np.dtype([('x', dt1),('y', dt2)])

In [837]: z=np.ones((3,), dtype=dt)
In [838]: z
Out[838]: 
array([((1, 1), (b'1', 1)), ((1, 1), (b'1', 1)), ((1, 1), (b'1', 1))], 
      dtype=[('x', [('sec', '<i8'), ('nsec', '<i8')]), ('y', [('name', 'S10'), ('value', '<i4')])])

In [839]: z['x']['sec']
Out[839]: array([1, 1, 1], dtype=int64)

In [841]: z['y'][0]['name']='y0 name'
In [842]: z
Out[842]: 
array([((1, 1), (b'y0 name', 1)), ((1, 1), (b'1', 1)), ((1, 1), (b'1', 1))], 
      dtype=[('x', [('sec', '<i8'), ('nsec', '<i8')]), ('y', [('name', 'S10'), ('value', '<i4')])])
In [843]: z[0]
Out[843]: ((1, 1), (b'y0 name', 1))

字典可以使用类似的语法

In [845]: d={'x':np.ones((3,),dt1), 'y':np.zeros((4,),dt2)}
In [846]: d
Out[846]: 
{'x': array([(1, 1), (1, 1), (1, 1)], 
       dtype=[('sec', '<i8'), ('nsec', '<i8')]),
 'y': array([(b'', 0), (b'', 0), (b'', 0), (b'', 0)], 
       dtype=[('name', 'S10'), ('value', '<i4')])}
In [847]: d['y'][0]['name']='y0 name'

【讨论】:

  • 如何声明长度未知的numpy数组?
猜你喜欢
  • 2022-11-03
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多