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