2016-08-03 5 views
0

テーラーでテンソルにいくつかの関数を適用したい。ここに私のnumpyバージョンのスクリプトです。しかし、これをTheanoバージョンに変換すると失われます。numpy apply_along_axisのtheano対応部分は何ですか?

def reverse_and_shift(vec): 
    ''' 
    Returns reversed array of the given vector except the leading 0's. 
    vec: 1-d array. 
    >>> reverse_and_shift(np.array([0,0,1,2,3])) 
    array([0, 0, 3, 2, 1]) 
    ''' 
    reversed = vec[::-1] 
    num_zero = len(vec) - np.count_nonzero(vec) 
    shifted = np.roll(reversed, num_zero) 
    return shifted 

np.apply_along_axis(reverse_and_shift, -1, A) 

どのように私はテンソルでこれを実行することができます。

は例えば、私は次のように私のnumpyのスクリプトがある

array([[[0, 0, 1, 2, 3], 
     [0, 1, 2, 3, 4]]]) 

array([[[0, 0, 3, 2, 1], 
     [0, 4, 3, 2, 1]]]) 

に変換したいですか?

答えて

0

異なる次元の配列でそれを試してみてください。

1次元配列の場合は、それがどんな機能を追加しません:2D配列について

In [36]: A=np.arange(10) 
In [38]: np.apply_along_axis(reverse_and_shift,-1,A) 
Out[38]: array([0, 9, 8, 7, 6, 5, 4, 3, 2, 1]) 
In [39]: reverse_and_shift(A) 
Out[39]: array([0, 9, 8, 7, 6, 5, 4, 3, 2, 1]) 

を、それは、第一次元上の反復に相当します(-1)最後に関数を適用する:第1回2次元のすべての値の3Dそれを反復するために

In [41]: A=np.arange(9).reshape(3,3) 
In [42]: np.apply_along_axis(reverse_and_shift,-1,A) 
Out[42]: 
array([[0, 2, 1], 
     [5, 4, 3], 
     [8, 7, 6]]) 

In [43]: reverse_and_shift(A[0,:]) 
Out[43]: array([0, 2, 1]) 
In [44]: reverse_and_shift(A[1,:]) 
Out[44]: array([5, 4, 3]) 
In [45]: reverse_and_shift(A[2,:]) 
Out[45]: array([8, 7, 6]) 

In [46]: np.array([reverse_and_shift(x) for x in A]) 
Out[46]: 
array([[0, 2, 1], 
     [5, 4, 3], 
     [8, 7, 6]]) 

を、最後にあなたの関数を適用します。

In [48]: A=np.arange(8).reshape(2,2,2) 
In [49]: np.apply_along_axis(reverse_and_shift,-1,A) 
Out[49]: 
array([[[0, 1], 
     [3, 2]], 

     [[5, 4], 
     [7, 6]]]) 

これらの値に対して独自の反復を行う方法はいくつかあります。最も簡単なの一つは、アプリケーション軸は最初、最後、またはある場合

In [50]: np.array([reverse_and_shift(x) for x in A.reshape(-1,2)]) 
Out[50]: 
array([[0, 1], 
     [3, 2], 
     [5, 4], 
     [7, 6]]) 
In [51]: _.reshape(2,2,2) 
Out[51]: 
array([[[0, 1], 
     [3, 2]], 

     [[5, 4], 
     [7, 6]]]) 

この変形アプローチが最も簡単である(当時と)2dにアレイを再構築することです。中間軸に沿って適用したい場合は、最初にある軸をスワップし、その軸を最後に移動するほうが簡単でしょう。

apply_along_axisはPythonで書かれていますので、読んで必要な部分を抽出することができます。すべての反復はPythonで行われるため、独自の反復を行うとパフォーマンスが低下することはありません。あなたの例の場合

=======================

Aは3Dです。その形状を維持する

In [70]: A.shape 
Out[70]: (1, 2, 5) 
In [71]: np.apply_along_axis(reverse_and_shift,-1,A) 
Out[71]: 
array([[[0, 0, 3, 2, 1], 
     [0, 4, 3, 2, 1]]]) 
In [72]: _.shape 
Out[72]: (1, 2, 5) 

reshape反復の場合、後で追加する必要がある次元が削除されます。

In [73]: np.array([reverse_and_shift(x) for x in A.reshape(-1,A.shape[-1])]) 
Out[73]: 
array([[0, 0, 3, 2, 1], 
     [0, 4, 3, 2, 1]]) 
In [74]: _.shape 
Out[74]: (2, 5) 

apply_along_axis(おおよそ)

outarr=np.zeros_like(A) 
for <all applicable i,j>: 
    ind = (i,j,slice(None)) 
    outarr[ind] = reverse_and_shift(A[ind]) 
を行います
関連する問題