来自CSV dtype的numpy recarray有很多列,但形状只是一行,为什么呢?

时间:2016-04-25 02:14:11

标签: python csv numpy matrix recarray

我的CSV包含字符串和数字列。 nump.recfromcsv准确地推断出他们(woo-hoo)给出了一个dtype

  

dtype = [(' null',' S7'),(' 00','< f8'),(& #39; nsubj',' S20'),(' g',' S1'),...

你可以看到字符串和数字的混合。但numpy.shape(csv)给了我

  

(133433)

这使我感到困惑,因为dtype暗示它是列感知的。此外,它直观地访问:

csv[1]
> ('def', 0.0, 'prep_to', 'g', 'query_w', 'indef', 0.0, ...

我也得到了错误

  

无法使用灵活类型执行缩减

对.all()等操作,即使使用数字列也是如此。我不确定我是否真的使用类似于表格的实体(两个维度)或只是一个列表。为什么dtype与形状不一致?

1 个答案:

答案 0 :(得分:2)

重新排列是一系列记录。每条记录可以有多个字段。记录有点像C中的结构。

如果重新排列的形状是(133433,),那么重新排列是一维的 一系列记录。

可以通过基于名称访问重新排列的字段 索引。例如,csv['nsub']并且基本上等同于

np.array([record['nsub'] for record in csv])

这种基于特殊名称的索引支持这样的错觉:1维重排是一个二维数组 - csv[intval]选择行,csv[fieldname]选择“列”。然而,严格的引擎盖下 如果形状是(133433,),那么它就是一维的。

请注意,并非所有重新排列都是一维的。 可以进行更高维度的重组,

In [142]: arr = np.zeros((3,2), dtype=[('foo', 'int'), ('bar', 'float')])

In [143]: arr
Out[143]: 
array([[(0, 0.0), (0, 0.0)],
       [(0, 0.0), (0, 0.0)],
       [(0, 0.0), (0, 0.0)]], 
      dtype=[('foo', '<i8'), ('bar', '<f8')])

In [144]: arr.shape
Out[144]: (3, 2)

这是一个二维数组,其元素是记录。

以下是bar切片中的arr[:, 0]字段值:

In [148]: arr[:, 0]['bar']
Out[148]: array([ 0.,  0.,  0.])

以下是2D数组中的所有bar字段值:

In [151]: arr['bar']
Out[151]: 
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

In [160]: arr['bar'].all()
Out[160]: False

请注意,使用重组的替代方法是Pandas Dataframes。 操作Dataframes的方法比重组更多。你可能会发现它更方便。