形状(..., n * (n - 1)/2)
のテンソルの下三角部分に形状(..., n, n)
の...
の任意の形を表す配列をパックしたいと思います。 numpyので、私はテンソルの下三角にパッキング配列
import numpy as np
# Create the array to store data in
arbitrary_shape = (10, 11, 12)
n = 5
target = np.zeros(arbitrary_shape + (n, n))
# Create the source array
source = np.random.normal(0, 1, arbitrary_shape + (n * (n - 1)/2,))
# Create indices and set values
u, v = np.tril_indices(n, -1)
target[..., u, v] = source
# Check that everything went ok
print target[0, 0, 0]
としてそれを実装するこれまでのところ、私はtranspose
、reshape
とscatter_update
の組み合わせを使用してtensorflowで似た何かを達成することができましたでしょうが、それは不器用な感じ。
import tensorflow as tf
# Create the source array
source = np.random.normal(0, 1, (n * (n - 1)/2,) + arbitrary_shape)
sess = tf.InteractiveSession()
# Create a flattened representation
target = tf.Variable(np.zeros((n * n,) + arbitrary_shape))
# Assign the values
target = tf.scatter_update(target, u * n + v, source)
# Reorder the axes and reshape into a square matrix along the last dimension
target = tf.transpose(target, (1, 2, 3, 0))
target = tf.reshape(target, arbitrary_shape + (n, n))
# Initialise variables and check results
sess.run(tf.initialize_all_variables())
print target.eval()[0, 0, 0]
sess.close()
これを実現する方法はありますか?