我有兴趣创建一个2d numpy数组,其中每一行都可以通过唯一的字段名称引用。我已经尝试过像这样的记录数组:
class HomeController @Inject()(val messagesApi: MessagesApi)
extends Controller with I18nSupport {
def updateLocale(lang: String): EssentialAction = Action {
implicit request =>
printf(request.headers.get("Accept-Language").getOrElse("niente"))
printf(messagesApi("test.testing"))
Ok(views.html.index(messagesApi("test.testing")))
}
}
但是当我这样做简单算术时,这就失败了:
>>> a = np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])
有没有办法使用不需要为每个字段设置不同数据类型的命名字段,或者在我尝试进行数组数学时不会失败?
答案 0 :(得分:2)
recarray允许访问像对象属性这样的字段。所以这很有效。
a.x += 4
a.y += 5
答案 1 :(得分:2)
np.recarray((2, 10), dtype=[('x', 'f8'), ('y', 'f8')])
返回一个大小为2x10
的矩阵,其中每个元素都是两个元素的元组。因此,操作a+4.0
完全没有意义。
您必须独立访问重新排列的每个字段:
a[0,0].x += 4.0
答案 2 :(得分:2)
recarray
和structured
数组不是设计用于命名列的便捷方式。它们意味着包含各种数据类型,可以从CSV文件加载的东西 - 字符串,整数,浮点数,日期。
跨字段可以执行的操作是有限的。如您所见,您无法为整个数组添加值。您必须逐字段添加它 - 只要字段类型正确。同样,您无法对2个字段求和,也可以取其均值(使用np.sum
或np.mean
函数)。也不能重塑或转置这些数组(交换行等字段)。
Constructing np.array with overlapping fields in dtype是一个当前的SO问题,它说明了以两列数组的形式访问几个字段的几种方法。
最好坚持使用普通的nd数组,除非你真的需要增加结构化数组的灵活性。如果要按名称访问列,请考虑定义变量,例如ind_x=0
,ind_y=1
,因此您可以使用a[2:5, ind_x]
。