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不适合此任务。例如,您可以对字符串进行编码(即手动构造指针)使用say
hash
函数,并将主题存储在其他位置。我发现没有简单的解决方案。您的解决方案有点可行,但我担心,它需要预先分配空间,而不考虑实际数据。我的问题是,字段的长度可以从大约
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')])