我有几个巨大的(1.7GB)csv文件,我必须重新组织数据结构。 所以首先我在文件中读取以确定我必须创建的numpy数组的尺寸,然后我可以开始填充数组。我的问题是,数组中的第一列必须是String类型('| S12'),其余列必须是浮点数('
我想以这种方式定义numpy.dtype:dt = np.dtype('|S12',('<f8', 51))
。
浮动的数量最终将是一个变量。
当我创建数组时,使用dt
然后我得到一个字符串数组。
z = np.zeros( (2,52), dtype=dt)
正确的类型定义如何?
干杯,托马斯
答案 0 :(得分:1)
你可能想要这个:
def make_dtype(n_float_cols):
spec = dict(
names=['name'] + ['f{:03d}'.format(i) for i in range(n_float_cols)],
formats=['|S12'] + ['<f8'] * n_float_cols,
)
return np.dtype(spec)
dt = make_dtype(51)
调整味道。
答案 1 :(得分:1)
最接近原始尝试的解决方案是:
n = 6 # easier to test than 51 :P
dt = np.dtype([('name', 'S12'), ('values', '<f8', n)])
您可以使用您选择的任何名称替换'name'
和'values'
。然后,要创建一个空数组,请不要指定列数,因为从技术上讲,具有结构化dtype的数组只有1d:
>>> np.zeros(2, dtype=dt)
array([('', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
('', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])],
dtype=[('name', 'S12'), ('values', '<f8', (6,))])
要访问数组,您可以使用z['name']
获取字符串,并使用z['values']
获取所有浮点数:
>>> z['name']
array(['', ''],
dtype='|S12')
>>> z['values']
array([[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.]])
如果您选择使用@ Robert的解决方案,则仍需要在创建阵列时仅指定行数。但请注意,不同之处在于浮点数是单个字段,而不是上面包含所有浮点数的一个字段:
>>> np.zeros(2, dtype=make_dtype(6))
array([('', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
('', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)],
dtype=[('name', 'S12'), ('f000', '<f8'), ('f001', '<f8'), ('f002', '<f8'), ('f003', '<f8'), ('f004', '<f8'), ('f005', '<f8')])
在这里您以相同的方式访问字符串,但您一次只能访问浮动的一个字段(如列):
>>> z['name']
array(['', ''],
dtype='|S12')
>>> z['f000']
array([ 0., 0.])