我有一个ndarray
子类,正确实现了__array_wrap__
,np.apply_along_axis
没有返回子类的实例,而是ndarrays
。下面的代码复制了我的问题:
import numpy as np
class MySubClass(np.ndarray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'info', None)
def __array_wrap__(self, out_arr, context=None):
return np.ndarray.__array_wrap__(self, out_arr, context)
sample_ndarray = np.array([[0,5],[2.1,0]])
sample_subclass = MySubClass(sample_ndarray, info="Hi Stack Overflow")
# Find the smallest positive (>0) number along the first axis
min_positive = np.apply_along_axis(lambda x: np.min(np.extract(x>0,x)),
0, sample_subclass)
# No more info
print hasattr(min_positive, 'info')
# Not a subclass
print isinstance(min_positive, MySubClass)
# Is an ndarray
print isinstance(min_positive, np.ndarray)
我能找到的最相关的问题是this one,但大家一致认为{np.extract
和np.min
都按预期返回子类,只是在使用apply_along_axis
时,我看到了这种行为。在
有没有办法让我的代码返回我的子类? 我使用的是numpy 1.11.0版
查看
apply_along_axis
代码(通过Ipython??)在我跳过了很多细节,但基本上它使用了}和{},但没有努力调整数组子类。在
np.zeros
和{许多numpy函数将操作委托给数组的方法,或者使用
_wrapit
(_wrapit(a, 'take', indices, axis, out, mode)
)。在您真的需要使用
apply_along_axis
?没什么神奇的。您可以在自己的代码中执行相同的迭代,而且速度一样快。在=================
下面是2
^{pr2}$apply_along_axis
示例和其他实现。它们太小,无法进行有意义的计时,我确信它们同样快,如果不是更多的话:直接阵列实现:
^{3}$第二:
在第一步中,我完全跳过迭代;在第二步,我使用相同的分配和迭代,开销较小。在
查看}以了解如何实现
np.matrix
和{ndarray
子类的示例。在np.core.fromnumeric.py
作为_wrapit
函数,由np.take
等函数使用:因此,如果
obj
有一个__array_wrap__
方法,它将把它应用于数组结果。因此,您可以使用它作为包装apply_along_axis
以获取自己的类的模型。在相关问题 更多 >
编程相关推荐