python - 等价于 NumPy 中的命名元组?

标签 python collections numpy namedtuple

是否有可能创建一个行为非常像 collections.namedtuple 的 NumPy 对象,在某种意义上可以像这样访问元素:

data[1] = 42
data['start date'] = '2011-09-20'  # Slight generalization of what is possible with a namedtuple

我尝试使用复杂的数据类型:

>>> data = numpy.empty(shape=tuple(), dtype=[('start date', 'S11'), ('n', int)])

这将创建一个具有一种 namedtuple 类型的 0 维值;它几乎可以工作:

>>> data['start date'] = '2011-09-20'
>>> data
array(('2011-09-20', -3241474627884561860), 
      dtype=[('start date', '|S11'), ('n', '<i8')])

但是,元素访问不起作用,因为“数组”是 0 维的:

>>> data[0] = '2011-09-20'
Traceback (most recent call last):
  File "<ipython-input-19-ed41131430b9>", line 1, in <module>
    data[0] = '2011-09-20'
IndexError: 0-d arrays can't be indexed.

有没有一种方法可以使用 NumPy 对象获得上述所需的行为(通过字符串和索引进行项目分配)?

最佳答案

您可以使用 numpy.rec 模块执行类似的操作。您需要的是此模块中的 record 类,但我不知道如何直接创建此类的实例。一种间接的方法是首先创建一个包含单个条目的 recarray:

>>> a = numpy.recarray(1, names=["start date", "n"], formats=["S11", "i4"])[0]
>>> a[0] = "2011-09-20"
>>> a[1] = 42
>>> a
('2011-09-20', 42)
>>> a["start date"]
'2011-09-20'
>>> a.n
42

如果您知道如何直接创建 record 的实例,请告诉我。

关于python - 等价于 NumPy 中的命名元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489956/

相关文章:

c# - DataTemplate 内的 DataTemplate - ListBox 内的 ListBox

java - 返回时数组列表为空

python - 找出 90% 的工单得到处理的时间?

ruby-on-rails - collection_select 给出 ActiveRecord::AssociationTypeMismatch

python - 如何在 numpy python 中创建相似度矩阵?

python - C++ - 使用 numpy 嵌入 Python

c++ - 无法捕获异常!

python - 使用 Flask REST API 将三个参数传递给 MySQL

Python - 根据内容从输入文件中删除某些行

python - Python 中 devar 的模拟