评估numpy对象数组的几个元素

时间:2016-04-12 09:29:51

标签: numpy multidimensional-array indexing interpolation

我有一个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是包含A的每个元素的新值的ndarray。

感谢您的建议。

1 个答案:

答案 0 :(得分: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数组的每个元素。但我的时间测试表明,这并没有加速任何事情。