在NumPy数组中命名字段

时间:2016-04-05 18:30:23

标签: python arrays numpy

我有兴趣创建一个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')])

有没有办法使用不需要为每个字段设置不同数据类型的命名字段,或者在我尝试进行数组数学时不会失败?

3 个答案:

答案 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)

recarraystructured数组不是设计用于命名列的便捷方式。它们意味着包含各种数据类型,可以从CSV文件加载的东西 - 字符串,整数,浮点数,日期。

跨字段可以执行的操作是有限的。如您所见,您无法为整个数组添加值。您必须逐字段添加它 - 只要字段类型正确。同样,您无法对2个字段求和,也可以取其均值(使用np.sumnp.mean函数)。也不能重塑或转置这些数组(交换行等字段)。

Constructing np.array with overlapping fields in dtype是一个当前的SO问题,它说明了以两列数组的形式访问几个字段的几种方法。

最好坚持使用普通的nd数组,除非你真的需要增加结构化数组的灵活性。如果要按名称访问列,请考虑定义变量,例如ind_x=0ind_y=1,因此您可以使用a[2:5, ind_x]