numpy recarray可变长度的字符串

时间:2012-02-02 07:57:16

标签: python numpy recarray

是否可以在不知道字符串长度的情况下初始化将保存字符串的numpy重新排列?

作为一个(人为的)例子:

mydf = np.empty( (numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ] )

问题是我在用信息填充之前构建我的重新组合,并且我不一定知道file_name的最大长度。

我的所有尝试都会导致字符串字段被截断:

>>> mydf = np.empty( (2,), dtype=[('file_name',str),('file_size_mb',float)] )
>>> mydf['file_name'][0]='foobarasdf.tif'
>>> mydf['file_name'][1]='arghtidlsarbda.jpg'
>>> mydf
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
      dtype=[('file_name', 'S'), ('file_size_mb', '<f8')])
>>> mydf['file_name']
array(['f', 'a'], 
      dtype='|S1')

(顺便说一句,为什么mydf['file_name']显示'f'和'a'而mydf显示''和''?)

同样,如果我使用|S10的类型(例如)file_name进行初始化,那么事情就会被截断为10。

我能找到的唯一类似问题是this one,但是这会计算出适当的字符串长度先验,因此与我的不完全相同(因为我事先并不知道)

除了file_name与({)|S9999999999999(即一些荒谬的上限)初始化之外,还有其他选择吗?

1 个答案:

答案 0 :(得分:25)

不是使用STRING dtype,而是可以始终使用object作为dtype。这将允许将任何对象分配给数组元素,包括Python可变长度字符串。例如:

>>> import numpy as np
>>> mydf = np.empty( (2,), dtype=[('file_name',object),('file_size_mb',float)] )
>>> mydf['file_name'][0]='foobarasdf.tif'
>>> mydf['file_name'][1]='arghtidlsarbda.jpg'
>>> mydf
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
      dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')])

对于具有可变长度元素的数组概念的精神,这是一个可以获得的接近。数组的想法是元素以明确定义且规则间隔的存储器地址存储在存储器中,这禁止可变长度元素。通过将指针存储到数组中的字符串,可以避免这种限制。 (这基本上就是上面的例子。)