如何访问结构化数组中子数组指定元素及dtype形状疑问
关于Numpy结构化数组的两个问题解答
嘿,我来帮你搞定这两个numpy结构化数组的小问题,咱们一个个来~
1. 如何获取所有人员grades数组中位置0的成绩
你之前尝试的x[:]['grades'][0]之所以不对,是因为x[:]['grades']返回的是一个形状为(2, 2)的二维数组(2个人,每个人2个成绩),这时取[0]会拿到第一行的成绩,而不是所有人的第一个成绩。
正确的做法是把字段访问和多维数组的列索引结合起来,直接用:
x['grades'][:, 0]
运行这个代码会得到:
array([8., 6.])
简单解释下:
x['grades']先取出所有人员的成绩,得到一个(2,2)的二维数组[:, 0]表示取这个二维数组的所有行,第0列,正好就是所有人的第一个成绩
另外,你也可以用结构化数组的另一种索引方式,效果完全一致:
x[:, 'grades'][..., 0]
不过第一种写法更直观常用~
2. 为什么不同的形状声明写法都能得到相同结果
numpy在解析结构化数组dtype的字段形状时,做了相当灵活的兼容处理,所以你提到的这些写法最终都会被转换成相同的一维数组形状(2,),具体原因:
(2,):这是numpy里表示一维数组形状的标准写法,明确告诉numpy这个字段是长度为2的一维数组2:传入整数时,numpy会自动将其视为长度为该整数的一维数组,等价于(2,)(2):在Python里,(2)其实就是整数2(只有加逗号的(2,)才是单元素元组),所以numpy处理时和传入2是一样的[2]或[2,]:传入列表形式的形状时,numpy会自动把它转换成对应的元组形状,也就是(2,)
虽然这些写法都能工作,但还是推荐使用(2,)这种标准元组写法,尤其是在处理多维字段时(比如形状(2,3)),这种写法更清晰,不会产生歧义。
内容的提问来源于stack exchange,提问作者mapf
相关产品推荐
相关产品推荐

