为什么numpy apply_along_axis无效

时间:2017-10-08 18:54:51

标签: python-3.x numpy

下面是两个numpy ndarray,它们具有相同的行但顺序不同。当我按行应用函数g1时,我希望得到相同的结果,但顺序不同。但情况并非如此。

public class HubIdentityUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        return request == null
            ? throw new ArgumentNullException(nameof(request))
            : request.User?.Identity?.GetUserId();
    }
}

我的系统是: numpy:1.13.1: python:3.6.2: Win10 Pro: conda:4.3.27

由于

1 个答案:

答案 0 :(得分:2)

重新创建计算:

In [25]: def g1(x):
    ...:     return max(0,  (x[0] - 1)**2 + (x[1] - 1)**2 - 1.05**2)
    ...: 
In [26]: g1([0,0])
Out[26]: 0.8975
In [27]: g1([1,1])
Out[27]: 0
In [28]: np.apply_along_axis(g1,1,[[0,0],[1,1]])
Out[28]: array([ 0.8975,  0.    ])
In [29]: np.apply_along_axis(g1,1,[[1,1],[0,0],[1,1]])
Out[29]: array([0, 0, 0])

注意Out[29]是一个整数数组,而不是你描述的浮点数(它不是复制粘贴的吗?)。

apply_along_axis使用试算计算来确定返回的dtype。如果第一种情况返回整数,那么它会创建一个整数数组来获取结果。将float分配给整数数组会导致截断。

我已经在np.vectorize看到了这个问题,并且怀疑它也发生在这里。我们可以查看apply_along_axis的代码,以验证其发生的位置和方式。

因此,将g1更改为max(0.0, ...)可确保函数始终返回float,apply将返回正确的dtype。

相关的代码:

res = asanyarray(func1d(inarr_view[ind0], *args, **kwargs))

# build a buffer for storing evaluations of func1d.
# remove the requested axis, and add the new ones on the end.
# laid out so that each write is contiguous.
# for a tuple index inds, buff[inds] = func1d(inarr_view[inds])
buff = zeros(inarr_view.shape[:-1] + res.shape, res.dtype)