我的CSV混合了字符串和数字列。nump.recfromcsv
精确地推断了它们(哇-呼),给出了一个d型的
dtype=[('null','S7'),('00','
所以你可以看到字符串和数字的混合。但是numpy.shape(csv)
给了我
(133433,)
这让我很困惑,因为dtype暗示它知道列。此外,它还直观地访问:
csv[1]
> ('def', 0.0, 'prep_to', 'g', 'query_w', 'indef', 0.0, ...
我也知道错误
不能用灵活的类型执行约简
对于像.all()这样的操作,即使在使用数值列时也是如此。我不确定我是否真的在处理一个类似于表的实体(二维),或者仅仅是一个列表。为什么dtype与形状不一致?
发布于 2016-04-25 02:45:13
recarray是记录的数组。每个记录可以有多个字段。记录有点像C中的结构。
如果recarray的形状是(133433,)
,那么recarray是一个一维记录数组。
可以通过基于名称的索引来访问recarray的字段。例如,csv['nsub']
和实质上等同于
np.array([record['nsub'] for record in csv])
这种特殊的基于名称的索引支持这样一种错觉,即一维recarray是一个二维数组-- 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
请注意,使用recarrays的另一种替代方法是熊猫数据。用于操作Dataframes的方法比recarrays多得多。你可能会觉得更方便。
https://stackoverflow.com/questions/36831072
复制相似问题