下面是两个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
由于
答案 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)