Python numpy中的可变/未知长度字符串/unicode数据类型
是否可以以某种方式加载具有未知字段长度的文本字段的数组 我想出了如何传递Python numpy中的可变/未知长度字符串/unicode数据类型,python,python-3.x,numpy,Python,Python 3.x,Numpy,是否可以以某种方式加载具有未知字段长度的文本字段的数组 我想出了如何传递dtype以将字符串放入其中。但是,没有指定长度,我只得到U0。类型,该类型似乎无法保存任何数据。例如: data = io.StringIO("test data lololol\ntest2 d4t4 ololol") >>> ar = numpy.loadtxt(data, dtype=[("1",str), ("2",'S'), ("3",'S')]) >>> ar array([
dtype
以将字符串放入其中。但是,没有指定长度,我只得到U0
。类型,该类型似乎无法保存任何数据。例如:
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=io.StringIO(“测试数据LOLOL\ntest2 d4t4 LOLOL”)
>>>ar=numpy.loadtxt(数据,dtype=[(“1”,str),(“2”,S'),(“3”,S'))
>>>ar
数组([(“”,b“”,b“”),(“”,b“”,b“”)],
dtype=[('1','
使用np.recfromtxt
,它可以自动生成dtype
。它使用dtype=None
有效地调用np.genfromtxt
数据如下:
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')])
numpy不适合此任务。例如,您可以对字符串进行编码(即手动构造指针)使用sayhash
函数,并将主题存储在其他位置。我发现没有简单的解决方案。您的解决方案有点可行,但我担心,它需要预先分配空间,而不考虑实际数据。我的问题是,字段的长度可以从大约10
到100
个字符,这适用于10^6到10^8行。这就是我不喜欢它的原因。我接受了你的解决方案,因为对于较小的数据集,它可能是可以自动工作的,我喜欢。我个人将标志编码为二进制,并提供struint
字典映射以供以后解码。这样我做了一些额外的工作,但节省了大量空间。所以你担心如果genfromtxt
选择S100
以适应最长的记录字段,即其他记录中会有大量空格?我认为如果字符串存储在数组本身中(记录大小不变),则必须如此。另一种选择是object
dtype
,字符串存储为常规Python字符串(数组中只有指针)。
array([('david', 'weight_2005', 50), ('david', 'weight_2012', 60),
('david', 'height_2005', 150), ('david', 'height_2012', 160),...],
dtype=[('f0', 'S5'), ('f1', 'S11'), ('f2', '<i4')])
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')])