是否有可能以某种方式加载具有未知字段长度的文本字段的数组?
我想出了如何传递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')])
我可能会对S
或U
做得很好。在我的情况下,字段应该用于保存一组文本标志。像linux环境变量之类的东西。因此,预先分配大空间以防万一似乎是一个很大的浪费。特别是当行数达到数百万时。
我理解或有想法,这样的设计可以来自哪里。就像构造一个struct
之类的对象一样,它在连续的内存块中保存整行。但是,我想也许有办法让它像字符串一样保持指针。
有可能吗?
答案 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')])