1

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

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

如您所见,字符串和数字的混合。但是numpy.shape(csv)给我

(133433,)

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

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

我也收到错误

无法使用灵活类型执行 reduce

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

4

1 回答 1

2

recarray 是一个记录数组。每条记录可以有多个字段。记录有点像 C 中的结构。

如果recarray 的形状是(133433,)那么recarray 是记录的一维数组。

recarray 的字段可以通过基于名称的索引来访问。例如,csv['nsub']并且本质上等价于

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

这种特殊的基于名称的索引支持一维recarray 是二维数组的错觉——csv[intval]选择行,csv[fieldname]选择“列”。但是,在引擎盖下,严格来说,如果形状是,(133433,)那么它是一维的。

请注意,并非所有的重新数组都是一维的。有可能有一个更高维的recarray,

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.])

以下是bar二维数组中的所有字段值:

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

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

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

于 2016-04-25T02:45:13.557 回答