【发布时间】:2019-04-17 23:32:46
【问题描述】:
我正在使用 numpy 1.16.2。
简而言之,我想知道如何将对象类型字段添加到结构化数组中。通过recfunctions 模块的标准方式会引发错误,我想这是有原因的.因此,我想知道我的解决方法是否有任何问题。此外,我想了解为什么需要这种解决方法,以及在访问新创建的数组时是否需要格外小心。
下面是详细信息:
我有一个 numpy 结构化数组:
import numpy as np
a = np.zeros(3, dtype={'names':['A','B','C'], 'formats':['int','int','float']})
for i in range(len(a)):
a[i] = i
我想将object 类型的另一个字段“测试”添加到数组a。执行此操作的标准方法是使用 numpy 的 recfunctions 模块:
import numpy.lib.recfunctions as rf
b = rf.append_fields(a, "test", [None]*len(a))
此代码抛出错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-38-4a7be4f94686> in <module>
----> 1 rf.append_fields(a, "test", [None]*len(a))
D:\_Programme\Anaconda3\lib\site-packages\numpy\lib\recfunctions.py in append_fields(base, names, data, dtypes, fill_value, usemask, asrecarray)
718 if dtypes is None:
719 data = [np.array(a, copy=False, subok=True) for a in data]
--> 720 data = [a.view([(name, a.dtype)]) for (name, a) in zip(names, data)]
721 else:
722 if not isinstance(dtypes, (tuple, list)):
D:\_Programme\Anaconda3\lib\site-packages\numpy\lib\recfunctions.py in <listcomp>(.0)
718 if dtypes is None:
719 data = [np.array(a, copy=False, subok=True) for a in data]
--> 720 data = [a.view([(name, a.dtype)]) for (name, a) in zip(names, data)]
721 else:
722 if not isinstance(dtypes, (tuple, list)):
D:\_Programme\Anaconda3\lib\site-packages\numpy\core\_internal.py in _view_is_safe(oldtype, newtype)
492
493 if newtype.hasobject or oldtype.hasobject:
--> 494 raise TypeError("Cannot change data-type for object array.")
495 return
496
TypeError: Cannot change data-type for object array.
here 讨论了一个类似的错误,虽然这个问题很老,我不知道我观察到的行为是否实际上是一个错误。 Here我被告知不支持包含一般对象的结构化数组的视图。
因此我建立了一个解决方法:
b = np.empty(len(a), dtype=a.dtype.descr+[("test", object)])
b[list(a.dtype.names)] = a
这行得通。尽管如此,我有以下问题:
问题
- 为什么需要这种解决方法?这只是一个错误吗?
- 使用新数组
b似乎与使用a没有什么不同。变量c = b[["A", "test"]]显然是b数据的视图。那么为什么would they say 不支持数组b上的视图呢?我是否必须格外小心对待c?
【问题讨论】:
-
我不认为
recfunctions是标准。它们是可以使用的实用程序,但您不必使用它们。它们没有被编译,因此不会做任何没有它们就不能做的事情。 -
stackoverflow.com/questions/42364725/… - 基本上是相同的问题,尝试将
append_fields与对象 dtype 一起使用。另一种方法是附加一个datetime64字段。
标签: python numpy structured-array