【问题标题】:Evaluate several elements of numpy object array评估numpy对象数组的几个元素
【发布时间】:2016-04-12 09:29:51
【问题描述】:

我有一个存储相同类型对象的 ndarray A,特别是各种 LinearNDInterpolator 对象。例如,假设它只是 2:

>>> A
array([ <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe122adc750>,
       <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe11daee590>], dtype=object)

我希望能够做两件事。首先,我想在某个点评估 A 中的所有对象,并返回一个包含所有值的 A.shape 的 ndarray。类似的东西

>> A[[0,1]](1,1) = 
array([ 1, 2])

但是,我明白了

TypeError: 'numpy.ndarray' object is not callable

有可能做到吗?

其次,我想在不构造新的 LinearNDInterpolator 对象的情况下更改插值值(因为节点保持不变)。即,类似

A[[0,1]].values = B

其中 B 是一个 ndarray,其中包含 A 的每个元素的新值。

感谢您的建议。

【问题讨论】:

    标签: numpy multidimensional-array indexing interpolation


    【解决方案1】:

    同样的问题,但功能更简单:

    In [221]: A=np.array([add,multiply])
    
    In [222]: A[0](1,2)  # individual elements can be called
    Out[222]: 3
    
    In [223]: A(1,2)    # but not the array as a whole
    ---------------------------------------------------------------------------    
    TypeError: 'numpy.ndarray' object is not callable 
    

    我们可以遍历函数列表或数组,调用参数上的每个元素。如果做得好,我们甚至可以压缩函数列表和参数列表。

    In [224]: ll=[add,multiply]
    
    In [225]: [x(1,2) for x in ll]
    Out[225]: [3, 2]
    
    In [226]: [x(1,2) for x in A]
    Out[226]: [3, 2]
    

    另一个测试,callable 函数:

    In [229]: callable(A)
    Out[229]: False
    
    In [230]: callable(A[0])
    Out[230]: True
    

    您可以更改单个插值器的插值值吗?如果是这样,只需遍历列表并执行此操作。

    通常,dtype 对象数组的功能类似于列表。它们包含相同类型的对象指针。大多数操作都需要相同类型的迭代。除非您需要在多个维度上组织元素,否则 dtype 对象数组与列表相比几乎没有优势。

    另一个想法 - 普通数组 dtype 是数字或固定长度的字符串。这些元素不可调用,因此无需在这些数组上实现.__call__ 方法。他们可以编写类似的东西来操作对象 dtype 数组,但核心操作是 Python 调用。所以这样的函数只会隐藏我概述的那种迭代。

    在最近的另一个问题中,我展示了如何使用np.char.upper 将字符串方法应用于S dtype 数组的每个元素。但我的时间测试表明,这并没有加快任何速度。

    【讨论】:

    • 您好,谢谢您的回答。问题是数组是 n 维的,因此使用列表或循环会很乏味。我设法使用 numpy.frompyfunc 完成了第一件事:我可以定义 eval_element = lambda array: array(1,1),然后定义 eval_ufunc = np.frompyfunc(eval_element, 1, 1)。 eval_ufunc(A) 然后返回在 (1,1) 处评估的每个 LinearNDinterpolator 的 ndarray。
    • 是的,您可以更改插值器的值,它们存储在 A[0].values 属性中。
    • frompyfunc 不受欢迎。我已经在一些 SO 答案中使用了它,例如。 stackoverflow.com/a/36297194/901925
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2021-12-30
    • 2013-12-25
    • 1970-01-01
    • 2017-04-25
    • 2017-01-08
    相关资源
    最近更新 更多