首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自CSV的numpy recarray有许多列,但是shape只表示一行,为什么呢?

来自CSV的numpy recarray有许多列,但是shape只表示一行,为什么呢?
EN

Stack Overflow用户
提问于 2016-04-25 02:14:10
回答 1查看 301关注 0票数 1

我的CSV混合了字符串和数字列。nump.recfromcsv精确地推断了它们(哇-呼),给出了一个d型的

dtype=[('null','S7'),('00','

所以你可以看到字符串和数字的混合。但是numpy.shape(csv)给了我

(133433,)

这让我很困惑,因为dtype暗示它知道列。此外,它还直观地访问:

代码语言:javascript
运行
复制
csv[1]
> ('def', 0.0, 'prep_to', 'g', 'query_w', 'indef', 0.0, ...

我也知道错误

不能用灵活的类型执行约简

对于像.all()这样的操作,即使在使用数值列时也是如此。我不确定我是否真的在处理一个类似于表的实体(二维),或者仅仅是一个列表。为什么dtype与形状不一致?

EN

回答 1

Stack Overflow用户

发布于 2016-04-25 02:45:13

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

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

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

代码语言:javascript
运行
复制
np.array([record['nsub'] for record in csv])

这种特殊的基于名称的索引支持这样一种错觉,即一维recarray是一个二维数组-- csv[intval]选择行,csv[fieldname]选择“列”。然而,在罩下,严格地说,如果形状是(133433,),那么它是一维的.

注意,并不是所有的重新数组都是一维的.有可能有一个高维的记录阵列,

代码语言:javascript
运行
复制
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]字段值:

代码语言:javascript
运行
复制
In [148]: arr[:, 0]['bar']
Out[148]: array([ 0.,  0.,  0.])

以下是2D数组中的所有bar字段值:

代码语言:javascript
运行
复制
In [151]: arr['bar']
Out[151]: 
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

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

请注意,使用recarrays的另一种替代方法是熊猫数据。用于操作Dataframes的方法比recarrays多得多。你可能会觉得更方便。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36831072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档