numpy recarray可变长度的字符串

mat*_*fee 17 python numpy recarray

是否可以初始化一个将保持字符串的numpy重新排列,而不事先知道字符串的长度?

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

mydf = np.empty( (numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ] )
Run Code Online (Sandbox Code Playgroud)

问题是我在用信息填充之前构建我的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')
Run Code Online (Sandbox Code Playgroud)

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

同样,如果我用型(比如说)初始化|S10file_name这种事情会在长度10截断.

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

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

Too*_*len 26

不使用STRINGdtype,可以始终使用objectdtype.这将允许将任何对象分配给数组元素,包括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')])
Run Code Online (Sandbox Code Playgroud)

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

  • 迟到的评论:如果您要从R移动,请考虑pandas.DataFrame对象,这对您来说应该非常熟悉并且能很好地处理字符串. (3认同)