正确的dtype定义

时间:2014-04-09 16:01:39

标签: python-2.7 numpy

我有几个巨大的(1.7GB)csv文件,我必须重新组织数据结构。 所以首先我在文件中读取以确定我必须创建的numpy数组的尺寸,然后我可以开始填充数组。我的问题是,数组中的第一列必须是String类型('| S12'),其余列必须是浮点数('

我想以这种方式定义numpy.dtype:dt = np.dtype('|S12',('<f8', 51))。 浮动的数量最终将是一个变量。 当我创建数组时,使用dt然后我得到一个字符串数组。

z = np.zeros( (2,52), dtype=dt)

正确的类型定义如何?

干杯,托马斯

2 个答案:

答案 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.])