2017-03-20 2 views
2

TFのテンソルの要素を与えられたインデックスに従って並べ替える必要があります。 2つの配列aとb(インデックス)から、bのインデックスに従ってaの要素を置換する新しい配列を計算する必要があります。空のインデックスの場合は、NA(または同等のもの)で埋める必要があります。例えばこのnumpyの配列置換のTensorFlowに相当するものは何ですか?

a = [10, 20, 30] 
b = [-1, 0, 3] 
output = [ 10, 20, NA, NA, 30] 

Iは、以下のnumpyのアレイになくTFテンソルのために何が起こるかと同等のものをコーディングする必要があります。

a = np.array([10,20,30]) 
b = np.array([-1,0,3]) 
mini = abs(np.min(b)) 
maxi = abs(np.max(b)) 
output = np.zeros(maxi+mini+1) 
for ai,bi in zip(a,b): 
    output[bi+mini]= ai 

TensorFlowテンソルではどうすればよいですか?

答えて

2

私はこれを達成するための方法を見つけました。他の人に役立つ場合は、私の回答をここに掲載しています。
TensorFlowのscatter_nd機能は、この状況で非常に便利です。 次のコードは、テンソルTで与えられた変換に従って入力テンソルIの要素を置換します。この置換に従って新しいテンソルを作成するには、scatter_ndを使用します。
考える

Input = [10, 20, 30] 
Transformation = [-1, 0, 3] 

Output = [10, 20, 0, 0, 30] 
を計算します:

sess = tf.InteractiveSession() 
I = tf.constant([10,20,30]) 
T = tf.constant([-1,0,3]) 
T = T - tf.reduce_min(T) 
T_shape = int(T.get_shape()[0]) 
T = tf.reshape(T, [T_shape,1]) 
O_shape = tf.reduce_max(T)+1 
O = tf.scatter_nd(T, I, [O_shape]) 
print(sess.run([I,T,O])) 
sess.close() 

このコードは、次のタスクを実行します

3

アフリカまたはヨーロッパ?

  1. インデックスが厳密に増加していることがわかっている場合は、tf.sparse_to_denseが必要です。

  2. インデックスが異なるが昇順になる場合は、tf.sparse_reorderを使用して注文を修正し、tf.sparse_tensor_to_denseを使用できます。

  3. 重複があり、一致する値を追加する場合は、tf.unsorted_segment_sumを使用します。

  4. 重複があり、最後のエントリが勝つようにしたい場合(正確にはPythonループに対応)、tf.dynamic_stitchを使用してください。

オプションの動物園へのお詫び。 opsはすべて異なる理由で追加されたため、全体的なデザインは特にクリーンではありません。

関連する問題