2024-10-05 15:25:00 发布
网友
我有兴趣创建一个2dnumpy数组,其中每一行都可以通过一个惟一的字段名来引用。我曾尝试过这样的记录数组:
>>> a = np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])
但当我这样做简单的算术时,这就失败了:
有没有一种方法可以使用命名字段,不需要为每个字段设置不同的数据类型,或者在我尝试进行数组运算时不会失败?在
recarray和structured数组不是为方便的命名列而设计的。它们是用来保存混合数据类型的,这是一种可以从CSV文件加载的东西——字符串、整数、浮点、日期。在
recarray
structured
可以跨字段执行的操作是有限的。正如您所发现的,您不能向整个数组添加值。如果字段类型正确,则必须逐个字段添加它。类似地,您不能求和这两个字段,或取它们的平均值(使用np.sum或np.mean函数)。也不能重塑或转置这些数组(将字段交换为行等)。在
np.sum
np.mean
Constructing np.array with overlapping fields in dtype是一个当前的SO问题,它说明了以2列数组的形式访问两个字段的几种方法。在
最好使用普通的nd阵列,除非您真的需要增加结构化阵列的灵活性。如果要按名称访问列,请考虑定义变量,例如ind_x=0,ind_y=1,这样就可以使用a[2:5, ind_x]。在
ind_x=0
ind_y=1
a[2:5, ind_x]
重新排列允许访问像对象属性这样的字段。所以这是有效的。在
a.x += 4 a.y += 5
np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])返回大小为2x10的矩阵,其中每个元素是两个元素的元组。因此,操作a+4.0根本没有意义。在
np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])
2x10
a+4.0
独立于每个字段的重新排列:
a[0,0].x += 4.0
recarray
和structured
数组不是为方便的命名列而设计的。它们是用来保存混合数据类型的,这是一种可以从CSV文件加载的东西——字符串、整数、浮点、日期。在可以跨字段执行的操作是有限的。正如您所发现的,您不能向整个数组添加值。如果字段类型正确,则必须逐个字段添加它。类似地,您不能求和这两个字段,或取它们的平均值(使用
np.sum
或np.mean
函数)。也不能重塑或转置这些数组(将字段交换为行等)。在Constructing np.array with overlapping fields in dtype是一个当前的SO问题,它说明了以2列数组的形式访问两个字段的几种方法。在
最好使用普通的nd阵列,除非您真的需要增加结构化阵列的灵活性。如果要按名称访问列,请考虑定义变量,例如
ind_x=0
,ind_y=1
,这样就可以使用a[2:5, ind_x]
。在重新排列允许访问像对象属性这样的字段。所以这是有效的。在
np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])
返回大小为2x10
的矩阵,其中每个元素是两个元素的元组。因此,操作a+4.0
根本没有意义。在独立于每个字段的重新排列:
相关问题 更多 >
编程相关推荐