我的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与形状不一致?
答案 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的方法比重组更多。你可能会发现它更方便。