我有以下数组:
a = ['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'] # strings
b = [0.0, 0.1] # floats
c = [0.0, 0.2] # floats
d = [0.0, 0.3] # floats
e = [0.0, 0.4] # floats
我的目标是创建一个最终的2d数组,以便保留数据类型,并使用numpy:
final = [a, b, c, d, e] -> [ ['(0.0 | 0.0 | 0.0)', ...] , [0.0, 0.1], ... ]
当我尝试用
执行此操作时np.array([a, b, c, d, e])
发生的事情是浮动转换为字符串。当然,我从numpy dtype doc开始查看dtype文档并尝试通过
创建自己的个人dtypedt = np.dtype([('f1', np.str), ('f2', np.float), ('f3', np.float), ('f4', np.float), ('f5', np.float)])
final = np.array([a, b, c, d, e], dtype=dt)
然而,它正在尝试将字符串数组转换为浮点数:
ValueError:无法将字符串转换为float:'(0.0 | 0.0 | 0.0)'
有谁知道我做错了什么?这应该是可能的......
答案 0 :(得分:1)
In [256]: a = ['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'] # strings
...: b = [0.0, 0.1] # floats
...: c = [0.0, 0.2] # floats
...: d = [0.0, 0.3] # floats
...: e = [0.0, 0.4] # floats
...:
...:
In [267]: dt = np.dtype([('f1', 'U20'), ('f2', np.float), ('f3', np.float), ('f4
...: ', np.float), ('f5', np.float)])
结构化数组必须使用元组列表进行初始化:
In [271]: [x for x in zip(a,b,c,d,e)]
Out[271]:
[('(0.0 | 0.0 | 0.0)', 0.0, 0.0, 0.0, 0.0),
('(0.0 | 0.0 | 0.1)', 0.1, 0.2, 0.3, 0.4)]
In [273]: np.array([x for x in zip(a,b,c,d,e)],dtype=dt)
Out[273]:
array([('(0.0 | 0.0 | 0.0)', 0. , 0. , 0. , 0. ),
('(0.0 | 0.0 | 0.1)', 0.1, 0.2, 0.3, 0.4)],
dtype=[('f1', '<U20'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8')])
按字段填写字段:
In [268]: arr = np.empty(2, dtype=dt)
In [269]: for n, x in zip(arr.dtype.names, [a,b,c,d,e]):
...: arr[n] = np.array(x)
...:
In [270]: arr
Out[270]:
array([('(0.0 | 0.0 | 0.0)', 0. , 0. , 0. , 0. ),
('(0.0 | 0.0 | 0.1)', 0.1, 0.2, 0.3, 0.4)],
dtype=[('f1', '<U20'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8')])
可以通过字段名称或记录号访问此类数组:
In [274]: arr['f1']
Out[274]: array(['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'], dtype='<U20')
In [276]: arr['f3']
Out[276]: array([0. , 0.2])
In [277]: arr[0]
Out[277]: ('(0.0 | 0.0 | 0.0)', 0., 0., 0., 0.)
这是一个1d数组,而不是2d。
另一个选项是对象dtype数组:
In [278]: np.array([a,b,c,d,e], dtype=object)
Out[278]:
array([['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'],
[0.0, 0.1],
[0.0, 0.2],
[0.0, 0.3],
[0.0, 0.4]], dtype=object)
In [279]: _.shape
Out[279]: (5, 2)