我的 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, ...
我也收到错误
cannot perform reduce with flexible type
在 .all() 等操作上,即使与数字列一起使用也是如此。我不确定我是否真的正在使用类似表格的实体(二维)或只是某物的一个列表。为什么dtype与shape不一致?
最佳答案
重新数组是一个记录数组。每条记录可以有多个字段。记录有点像 C 中的结构。
如果记录数组的形状为(133433,)
,则记录数组是一维
记录数组。
重新数组的字段可以通过基于名称的方式访问
索引。例如,csv['nsub']
本质上相当于
np.array([record['nsub'] for record in csv])
这种特殊的基于名称的索引支持一维数组是二维数组的错觉 - 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)
这是一个二维数组,其元素是记录。
以下是 arr[:, 0]
切片中的 bar
字段值:
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
请注意,使用重新排列的替代方法是 Pandas Dataframes 。 除了重新排列之外,还有更多的方法可用于操作数据帧。您可能会发现它更方便。
关于python - CSV dtype 中的 numpy rearray 有很多列,但 shape 只显示一行,这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831072/