2012-02-02 91 views
15

是否可以初始化一个可容纳字符串的numpy recarray,而不必事先知道字符串的长度?numpy recarray可变长度字符串

为A(人为)例如:

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

的问题是,我在我的构建中recarray事先与信息填充它,我不一定知道的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,但这calcu截断相应的字符串长度先验,因此与我的不太一样(因为我事先不知道)。

是否有其他选择,除了用|S9999999999999(例如|S9999999999999)来初始化file_name(即有些荒谬的上限)?

+0

这是一个很好的问题。在编程中,长度为0的字符串只让我把头发撕掉了半个小时! – Christoph 2012-07-20 11:49:20

回答

24

而不是使用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')]) 

它是一种对所述阵列概念的精神为具有可变长度的元件,但这是尽可能接近一个可以得到的。一个数组的想法是,元素被存储在定义良好且规则间隔的存储器地址中,这禁止了可变长度的元素。通过将指针存储到数组中的字符串,可以避开这个限制。 (这基本上是上面的例子。)

+0

感谢那 - 我只是从R语言转移,基本上想要一个数据帧的对象,这很好! – 2012-02-03 00:11:00

+3

最新评论:如果您从R移动,请考虑pandas.DataFrame对象,这对您应该看起来很熟悉,并且可以很好地处理字符串。 – mdurant 2015-05-29 15:14:05

相关问题