numpy recarray可变长度字符串
是否可以初始化一个可容纳字符串的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
(即有些荒谬的上限)?
而不是使用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')])
它是一种对所述阵列概念的精神为具有可变长度的元件,但这是尽可能接近一个可以得到的。一个数组的想法是,元素被存储在定义良好且规则间隔的存储器地址中,这禁止了可变长度的元素。通过将指针存储到数组中的字符串,可以避开这个限制。 (这基本上是上面的例子。)
感谢那 - 我只是从R语言转移,基本上想要一个数据帧的对象,这很好! – 2012-02-03 00:11:00
最新评论:如果您从R移动,请考虑pandas.DataFrame对象,这对您应该看起来很熟悉,并且可以很好地处理字符串。 – mdurant 2015-05-29 15:14:05
这是一个很好的问题。在编程中,长度为0的字符串只让我把头发撕掉了半个小时! – Christoph 2012-07-20 11:49:20