python - CSV dtype 中的 numpy rearray 有很多列,但 shape 只显示一行,这是为什么?

标签 python csv numpy matrix recarray

我的 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/

相关文章:

python - 我如何在内部跟踪 Python 枚举值?

csv - 生成 XLS 电子表格时如何不超过最大字体数量

python - 将多维数组中的元素映射到其索引

numpy - 使用scipy.splprep时如何指定结点数

python - 如何在 python 中模拟异常调用?

python - 使用标准库/模块在Python中从矩阵(csv)创建字典或列表

javascript - 我可以使用 Javascript 获取文件目录列表吗?

python - 从文本文件中识别列表

python - Theano 中的余弦相似度

python - 从 C 访问 Numpy 矩阵作为 3D 数组