在numpy结构化数组中存储单位信息的最佳方法是什么?

4

如何在numpy结构化数组中存储列的单位信息是最佳方式?

我尝试了这个,根据http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

字段名称也可以是两个字符串的二元组,其中第一个字符串是“标题”(可以是任何字符串或unicode字符串)或字段的元数据,可以是任何对象,第二个字符串是“名称”,必须是有效的Python标识符。

但是我怎样才能访问/读取这些元数据呢?

import numpy as np

dtype = np.dtype([
    ('name', 'S64'),
    (('s', 'read_time'), 'uint16'),
    (('us', 'read_latency'), 'float'),
    (('B', 'read_data'), 'uint64'),
])
my_data = np.zeros(10, dtype=dtype)

这个例子有点偏向,因为你似乎存储的单位总是不同的。例如,如果你尝试使用秒而不是微秒来读取延迟时间,你的例子就无法工作了...所以最初的问题非常好,但是例子并没有足够地指出它。 - Sigmun
2个回答

1
如果我理解你的需求,你想要 dtype 的 "descr" 属性:
In [12]: my_data.dtype.descr
Out[12]: 
[('name', '|S64'),
 (('s', 'read_time'), '<u2'),
 (('us', 'read_latency'), '<f8'),
 (('B', 'read_data'), '<u8')]

In [13]: my_data.dtype.descr[1]
Out[13]: (('s', 'read_time'), '<u2')

In [14]: my_data.dtype.descr[1][0][0]
Out[14]: 's'

你的方法在处理单元元数据方面很有意义。请注意,dtype还有一个“names”元组,其中仅包含字段名称(不包括单位)。

谢谢,我认为我更喜欢使用fields属性,因为我可以使用列的名称: my_data.dtype.fields['read_latency'][-1] >>> 'us' - jackson
这个解决方案有一个问题:例如,如果您添加另一个dtype,如(('s', 'write_time'), 'uint16'),则会出现ValueError: two fields with the same name的错误。 - jackson

0

你可能想要看一下Pint

文档中指出其中一个特性为:

NumPy 集成:当你选择使用 NumPy ndarray 时,它的方法和 ufuncs 都会被支持,包括单位的自动转换。例如 numpy.arccos(q) 将需要一个无量纲的 q,并且输出量的单位将是弧度。


1
这对于结构化数组不起作用。Pint数量仅支持每个ndarray的单个单位,而在结构化数组中,您希望为每个字段设置一个单位。 - gerrit
它也不能用于像np.dot这样的数组操作。我尝试跟进https://github.com/hgrecco/pint/issues/470,但没有得到回应。这个包已经不再更新了吗? - user32882
这看起来像是astropy.units使用的内容:https://docs.astropy.org/en/stable/units/#module-astropy.units - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接