Python Numpy沿_轴应用_,不返回ndarray子类

Python Numpy沿_轴应用_,不返回ndarray子类,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我有一个ndarray子类,正确实现了\uu数组\uuwrap\uuu,np。沿轴应用不是返回我的子类的实例,而是返回ndarray。下面的代码复制了我的问题: 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

我有一个
ndarray
子类,正确实现了
\uu数组\uuwrap\uuu
np。沿轴应用
不是返回我的子类的实例,而是返回
ndarray
。下面的代码复制了我的问题:

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)
我能找到的最相关的问题是,但那里的共识似乎是需要实现
\uuuu数组\uuuwrap\uuuu
,我已经做到了。另外,
np.extract
np.min
都会按预期返回子类,只有在使用
apply\u沿_轴
时,我才看到这种行为

有没有办法让我的代码返回我的子类?
我使用的是numpy版本1.11.0(通过Ipython???)查看
apply_沿_轴的代码

直接阵列实现:

In [8]: b[0,:]+b[-1,:]*0.5
Out[8]: array([ 4.5,  6. ,  7.5])

In [9]: b[:,0]+b[:,-1]*0.5
Out[9]: array([  2.5,   7. ,  11.5])
第二:

在第一步中,我完全跳过了迭代;在第二个示例中,我使用相同的分配和迭代,开销更少

查看
np.matrix
np.ma
以获取如何实现
ndarray
子类的示例


np.core.fromnumeric.py
作为
\u wrapit
函数,由
np.take等函数使用:

# functions that are now methods
def _wrapit(obj, method, *args, **kwds):
    try:
        wrap = obj.__array_wrap__
    except AttributeError:
        wrap = None
    result = getattr(asarray(obj), method)(*args, **kwds)
    if wrap:
        if not isinstance(result, mu.ndarray):
            result = asarray(result)
        result = wrap(result)
    return result

因此,如果
obj
有一个
\uuu数组\uu包裹\uuu
方法,它会将该方法应用于数组结果。因此,您可以将其用作沿轴包装
apply\u的模型,以返回您自己的课程。

谢谢您的详细回答。我很好奇是否有什么好的设计原因,apply_沿着_轴不返回子类,看起来唯一的原因就是方便。也许我可以修补它。虽然,你是对的,我不需要那个函数。即使在我的示例中,我也可以使用axis参数来
min()
,这个函数可能是在子类的使用不重要的时候编写的<代码>np。矩阵
已经存在很长时间了,但它只是2d。而
np.ma
通常需要使用自己的函数/方法。但是看看
np.lib.shape\u base.py
中的
np.kron
。它使用
asanyarray
subok
和一些自定义的
wrap
函数。这应该在numpy 1.13中修复,并且从开始,还将调用
\uuuu数组\uuu准备
In [8]: b[0,:]+b[-1,:]*0.5
Out[8]: array([ 4.5,  6. ,  7.5])

In [9]: b[:,0]+b[:,-1]*0.5
Out[9]: array([  2.5,   7. ,  11.5])
In [10]: c=np.array([[8,1,7],[4,3,9],[5,2,6]])

In [11]: np.apply_along_axis(sorted, 1, c)
Out[11]: 
array([[1, 7, 8],
       [3, 4, 9],
       [2, 5, 6]])

In [12]: d=np.zeros_like(c)
In [13]: for i in range(c.shape[0]):
   ....:     d[i,:] = sorted(c[i,:]) 

In [14]: d
Out[14]: 
array([[1, 7, 8],
       [3, 4, 9],
       [2, 5, 6]])
# functions that are now methods
def _wrapit(obj, method, *args, **kwds):
    try:
        wrap = obj.__array_wrap__
    except AttributeError:
        wrap = None
    result = getattr(asarray(obj), method)(*args, **kwds)
    if wrap:
        if not isinstance(result, mu.ndarray):
            result = asarray(result)
        result = wrap(result)
    return result