numpy中的变量/未知长度字符串/ unicode dtype

时间:2013-12-17 22:48:09

标签: python python-3.x numpy

是否有可能以某种方式加载具有未知字段长度的文本字段的数组?

我想出了如何传递dtype来获取字符串。但是,如果没有指定长度,我只需获得U0。似乎无法保存任何数据的类型。 E.g:

data = io.StringIO("test data lololol\ntest2 d4t4 ololol")
>>> ar = numpy.loadtxt(data, dtype=[("1",str), ("2",'S'), ("3",'S')])
>>> ar
array([('', b'', b''), ('', b'', b'')], 
      dtype=[('1', '<U0'), ('2', '|S0'), ('3', '|S0')])

当我更改为指定大小的模式时,我得到输入:

>>> data.seek(0)
0
>>> numpy.loadtxt(data, dtype=[("1",(str,30)), ("2",(str,30)), ("3",('S',30))])
array([("b'test'", "b'data'", b'lololol'),
       ("b'test2'", "b'd4t4'", b'ololol')], 
      dtype=[('1', '<U30'), ('2', '<U30'), ('3', '|S30')])

我可能会对SU做得很好。在我的情况下,字段应该用于保存一组文本标志。像linux环境变量之类的东西。因此,预先分配大空间以防万一似乎是一个很大的浪费。特别是当行数达到数百万时。

我理解或有想法,这样的设计可以来自哪里。就像构造一个struct之类的对象一样,它在连续的内存块中保存整行。但是,我想也许有办法让它像字符串一样保持指针。

有可能吗?

1 个答案:

答案 0 :(得分:0)

getting indices in numpy 使用np.recfromtxt,可以自动生成dtype。实际上,它会使用np.genfromtxt来调用dtype=None

数据如:

david weight_2005 50
david weight_2012 60
david height_2005 150
david height_2012 160

产生一个:

array([('david', 'weight_2005', 50), ('david', 'weight_2012', 60),
       ('david', 'height_2005', 150), ('david', 'height_2012', 160),...], 
      dtype=[('f0', 'S5'), ('f1', 'S11'), ('f2', '<i4')])

genfromtxt中用于确定dtype的代码看起来很复杂。我猜它会调整Snn以适应它在该字段中遇到的最长字符串。

自定义dtype的一种方法是在names中分配getnfromtxt,然后使用astype重新构建值。

x=np.genfromtxt('stack19944408.txt',dtype=None,names=['one','two','thr'])
x.astype(dtype=[('one','S10'),('two','S10'),('thr','f')])
#array([('david', 'weight_200', 50.0), ('david', 'weight_201', 60.0),
#       ...
#      dtype=[('one', 'S10'), ('two', 'S10'), ('thr', '<f4')])