- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 numpy.lib.recfunctions append_fields 函数将数组附加到 numpy recarray。
如果 recarray 字段名称是 unicode,我会收到“TypeError:数据类型不理解”错误。
此行为是否符合设计,如果是,是否有变通方法?
在 Win32 计算机上使用 python 2.7。
下面的代码演示了这个问题(请原谅额外的日期时间操作 - 我想尽可能接近我原来的错误):
from datetime import datetime
import numpy as np
import numpy.lib.recfunctions as RF
x1=np.array([1,2,3,4])
x2=np.array(['a','dd','xyz','12'])
x3=np.array([1.1,2,3,4])
# this works
FileData = np.core.records.fromarrays([x1,x2,x3],names=['a','b','c'])
# this doesnt
#FileData = np.core.records.fromarrays([x1,x2,x3],names=[u'a',u'b',u'c'])
sDT = ['1/1/2000 12:00:00','1/1/2000 13:00:00','1/1/2000 14:00:00','1/1/2000 15:00:00']
pDT = [datetime.strptime(x, '%d/%m/%Y %H:%M:%S') for x in sDT]
# convert to unix timestamp
DT = [ (np.datetime64(dt) - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's') for dt in pDT]
# add datetime to recaray
print FileData.dtype
FileData = RF.append_fields(FileData,'DateTime', data=DT) #, dtypes='f8'
print FileData.dtype
最佳答案
使用 unicode
名称的代码在 Python3
下运行良好,其中 unicode 是默认字符串类型。
编辑:最初我认为问题在于屏蔽数组。但是通过进一步测试,我得出结论,真正的问题是 dtype
是否可以接受 unicode(在 py2 情况下)名称。通常名称必须是字符串(但是版本定义了它们)。但是定义 dtype 的字典样式允许使用 unicode 名称。这是您的 fromarrays
有效但 append_fields
无效的根本原因。
我将保留掩码数组讨论,因为这是您接受的内容。
在2.7下,完整的错误栈是:
File "stack28586238.py", line 22, in <module>
FileData = RF.append_fields(FileData,'DateTime', data=DT) #, dtypes='f8'
File "/usr/local/lib/python2.7/site-packages/numpy/lib/recfunctions.py", line 633, in append_fields
base = merge_arrays(base, usemask=usemask, fill_value=fill_value)
File "/usr/local/lib/python2.7/site-packages/numpy/lib/recfunctions.py", line 403, in merge_arrays
return seqarrays.view(dtype=seqdtype, type=seqtype)
File "/usr/local/lib/python2.7/site-packages/numpy/core/records.py", line 501, in view
return ndarray.view(self, dtype, type)
File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 2782, in __array_finalize__
_mask = getattr(obj, '_mask', make_mask_none(obj.shape, odtype))
File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 1566, in make_mask_none
result = np.zeros(newshape, dtype=make_mask_descr(dtype))
File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 1242, in make_mask_descr
return np.dtype(_recursive_make_descr(ndtype, np.bool))
TypeError: data type not understood
错误发生在屏蔽数组函数中,调用如下:
np.ma.make_mask_none((3,),dtype=[(u'value','f4')])
我在之前的 SO 问题(不久前)中遇到了屏蔽数组的问题。我得看看它是否相关。
Is the mask of a structured array supposed to be structured itself?
没有直接关系,但它确实指出了混合掩码数组和结构化数组时的一些错误。
Adding datetime field to recarray是您之前关于 add_fields
的 SO 问题,重点是 datetime
类型。
通过添加 usemask=False
我将错误转移到另一点,它试图从两个组件 dtype 列表构造一个 dtype
:np. dtype(base.dtype.descr + data.dtype.descr)
.
在2.7中,我们可以构造一个记录数组
,unicode名称:
In [11]: np.core.records.fromarrays([[0,1]],names=[u'test'])
Out[11]:
rec.array([(0,), (1,)],
dtype=[(u'test', '<i4')])
但是我不能直接用unicode名称构造一个dtype
:
In [12]: np.dtype([(u'test', int)])
...
TypeError: data type not understood
看起来通常数据类型名称必须是字符串。在 python3
中,np.dtype([(b'test', int)])
产生相同的错误。
也在py3中
np.core.records.fromarrays([[0,1]],names=[b'test'])
产生一个 ValueError: field names must be strings
。
np.core.records.fromarrays
允许使用 unicode,因为它使用 format_parser
:
p=np.format_parser(['int'],[u'test'],[])
p.dtype
# dtype([(u'test', '<i4')])
之所以可行,是因为dtype 定义的字典样式接受 unicode:
np.dtype({'names':[u'test'],'formats':['int']})
这是一个合并两个具有 unicode 名称的结构化数组的示例(在 py2 中工作):
In [53]: dt1 = np.dtype({'names':[u'test1'],'formats':['int']})
In [54]: dt2 = np.dtype({'names':[u'test2'],'formats':['float']})
In [55]: dt12 = np.dtype({'names':[u'test1',u'test2'],'formats':['int','float']})
In [56]: arr1 = np.array([(x,) for x in [1,2,3]],dtype=dt1)
In [57]: arr2 = np.array([(x,) for x in [1,2,3]],dtype=dt2)
In [58]: arr12 = np.zeros((3,),dtype=dt12)
In [59]: RF.recursive_fill_fields(arr1,arr12)
...
In [60]: RF.recursive_fill_fields(arr2,arr12)
Out[60]:
array([(1, 1.0), (2, 2.0), (3, 3.0)],
dtype=[(u'test1', '<i4'), (u'test2', '<f8')])
append_fields
本质上就是这样做的(添加了一些花里胡哨的东西)。
我已经对 https://github.com/numpy/numpy/issues/2407 添加了评论dtype 字段名称不能是 unicode (Trac#1814)
关于python - 当数组名称是 unicode 时,numpy recfunctions append_fields 会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586238/
作为脚本的输出,我有 numpy masked array和标准numpy array .如何在运行脚本时轻松检查数组是否为掩码(具有 data 、 mask 属性)? 最佳答案 您可以通过 isin
我的问题 假设我有 a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.arra
numpy 是否有用于矩阵模幂运算的内置实现? (正如 user2357112 所指出的,我实际上是在寻找元素明智的模块化减少) 对常规数字进行模幂运算的一种方法是使用平方求幂 (https://en
我已经在 Numpy 中实现了这个梯度下降: def gradientDescent(X, y, theta, alpha, iterations): m = len(y) for i
我有一个使用 Numpy 在 CentOS7 上运行的项目。 问题是安装此依赖项需要花费大量时间。 因此,我尝试 yum install pip install 之前的 numpy 库它。 所以我跑:
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
numpy.random.seed(7) 在不同的机器学习和数据分析教程中,我看到这个种子集有不同的数字。选择特定的种子编号真的有区别吗?或者任何数字都可以吗?选择种子数的目标是相同实验的可重复性。
我需要读取存储在内存映射文件中的巨大 numpy 数组的部分内容,处理数据并对数组的另一部分重复。整个 numpy 数组占用大约 50 GB,我的机器有 8 GB RAM。 我最初使用 numpy.m
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
似乎 numpy.empty() 可以做的任何事情都可以使用 numpy.ndarray() 轻松完成,例如: >>> np.empty(shape=(2, 2), dtype=np.dtype('d
我在大型 numpy 数组中有许多不同的形式,我想使用 numpy 和 scipy 计算它们之间的边到边欧氏距离。 注意:我进行了搜索,这与堆栈中之前的其他问题不同,因为我想获得数组中标记 block
我有一个大小为 (2x3) 的 numpy 对象数组。我们称之为M1。在M1中有6个numpy数组。M1 给定行中的数组形状相同,但与 M1 任何其他行中的数组形状不同。 也就是说, M1 = [ [
如何使用爱因斯坦表示法编写以下点积? import numpy as np LHS = np.ones((5,20,2)) RHS = np.ones((20,2)) np.sum([ np.
假设我有 np.array of a = [0, 1, 1, 0, 0, 1] 和 b = [1, 1, 0, 0, 0, 1] 我想要一个新矩阵 c 使得如果 a[i] = 0 和 b[i] = 0
我有一个形状为 (32,5) 的 numpy 数组 batch。批处理的每个元素都包含一个 numpy 数组 batch_elem = [s,_,_,_,_] 其中 s = [img,val1,val
尝试为基于文本的多标签分类问题训练单层神经网络。 model= Sequential() model.add(Dense(20, input_dim=400, kernel_initializer='
首先是一个简单的例子 import numpy as np a = np.ones((2,2)) b = 2*np.ones((2,2)) c = 3*np.ones((2,2)) d = 4*np.
我正在尝试平均二维 numpy 数组。所以,我使用了 numpy.mean 但结果是空数组。 import numpy as np ws1 = np.array(ws1) ws1_I8 = np.ar
import numpy as np x = np.array([[1,2 ,3], [9,8,7]]) y = np.array([[2,1 ,0], [1,0,2]]) x[y] 预期输出: ar
我有两个数组 A (4000,4000),其中只有对角线填充了数据,而 B (4000,5) 填充了数据。有没有比 numpy.dot(a,b) 函数更快的方法来乘(点)这些数组? 到目前为止,我发现
我是一名优秀的程序员,十分优秀!