【问题标题】:New numpy array from attribute of objects in another numpy array来自另一个 numpy 数组中对象属性的新 numpy 数组
【发布时间】:2016-06-08 23:01:33
【问题描述】:

有没有办法从 numpy 数组中提取元素属性?例如,假设我有:

import numpy as np

class foo():
    def __init__(self, value):
        self.bar = value

obj_array = np.empty((2, 2), dtype='object')
for i in range(obj_array.shape[0]):
    for j in range(obj_array.shape[1]):
        obj_array[i, j] = foo(i+j)

bar_array_hard_way = np.empty_like(obj_array)
for i in range(obj_array.shape[0]):
    for j in range(obj_array.shape[1]):
        bar_array_hard_way[i, j] = obj_array[i, j].bar

在这里,我有一个对象数组。每个对象都有一些属性。我希望有一种巧妙的内置方法可以将这些属性提取为新的 numpy 数组。显然这是一个非常简单的例子,但是更大的数组元素方式的复制非常烦人。

【问题讨论】:

  • 这几乎肯定不是工作代码,因为obj_array.size[0] 无效......你的意思是obj_array.shape
  • 或许使用recarray

标签: python numpy


【解决方案1】:

我认为最快的方法是将 Python 的 operator.attrgetter 与 numpy 的 np.frompyfunction 结合起来——第一种方法提供了一种快速、内联的本机代码,用于检索对象的属性。第二种,将普通的 Python 函数转换为 Numpy 的广播函数,一次调用即可处理整个数组 -

所以,你的电话是:

from operator import attrgetter
import numpy as np
# code to build obj_array
...
bar_array_easy_way = np.frompyfunc(attrgetter("bar"), 1, 1)(obj_array)

将它与使用 fromtiterator 快​​速比较,在一半时间内从我的对象构建了 100 万个 int 数组 - 此外,fromiterator 无法使用 dtype=object 构建数组 - 只是固定大小的元素。

请注意,attrgetter 本身是一个“函数工厂”——它接受一个属性名称,并返回一个函数,该函数将接受任何对象并返回该属性。我们将返回的函数依次传递给 frompyfunc - 它接受其他 2 个参数,以允许 numpy 发挥其广播魔力:输入参数的数量和我们函数的返回结果的数量。

【讨论】:

    【解决方案2】:

    您可以将新数组创建为:

    bar_array = np.reshape(
        np.fromiter((x.bar for x in obj_array.flat), dtype=float),
        obj_array.shape)
    

    dtype 更改为您喜欢的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 2011-07-27
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多