2017-10-08 64 views
0

下面是兩個numpy ndarrays,它們有相同的行但順序不同。當我按行應用函數g1時,我期望得到相同的結果,但以不同的順序。但情況並非如此。爲什麼numpy apply_along_axis不起作用

g1(x): 
    return max(0, (x[0] - 1)**2 + (x[1] - 1)**2 - 1.05**2) 

Case1: 
sol1 = np.array(
     [ 
      [0, 0], 
      [1, 1], 
      [0, 1], 
      [1, 0], 
      [0.2, 0.7], 
      [0.5, 0.5], 
      [0.75, 0], 
      [0.25, 0.8], 
      [0.5, 0.6], 
      [0.2, 0.7], 
     ] 
) 
v = numpy.apply_along_axis(g1, 1, sol1) 

This produce: [ 0.8975, 0., 0., 0., 0., 0., 0., 0., 0., 0.] as expected. 
Case2: 
# The same array with rows shuffled. 
sols = numpy.array(
     [ 
      [0, 1], 
      [0.2, 0.7], 
      [0.5, 0.5], 
      [0.75, 0], 
      [0.2, 0.7], 
      [1, 0], 
      [0.25, 0.8], 
      [0.5, 0.6], 
      [0, 0], 
      [1, 1], 
     ] 
) 
v = numpy.apply_along_axis(g1, 1, sols) 
This produces: [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.] which is wrong. 
Should be: [ 0., 0., 0., 0., 0., 0., 0., 0., 0.8975, 0.] 

我的系統是: numpy的:1.13.1: 蟒蛇:3.6.2: Win10臨: 暢達:4.3.27

感謝

+0

,請返回 '最大(0.0,...)',即在所有情況下的浮動。 – hpaulj

+0

這兩種情況都適用,非常感謝。我只是想明白爲什麼這樣做會產生很大的影響 – Christie

回答

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使用試算來確定返回D型。如果第一個case返回整數,那麼它會創建一個整數數組來獲取結果。將float分配給整數數組會導致截斷。

我已經看到了這個問題np.vectorize,並懷疑它也發生在這裏。我們可以查看apply_along_axis的代碼來驗證它在哪裏以及如何發生。

因此改變g1max(0.0, ...)確保函數總是返回float,並且apply返回正確的D型。


相關的代碼:

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) 
+0

好的,thx的解釋。這是相當微妙的,肯定會造成一些問題。將來我會更加努力。 – Christie