2016-05-18 3 views
3

形状(..., 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] 

としてそれを実装するこれまでのところ、私はtransposereshapescatter_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() 

これを実現する方法はありますか?

答えて

2

私はこれは少し遅れている実感が、私は下三角行列をロードしようとしてきた、と私はそれがsparse_to_denseを使用して作業しました:

import tensorflow as tf 
import numpy as np 

session = tf.InteractiveSession() 

n = 4 # Number of dimensions of matrix 

# Get pairs of indices of positions 
indices = list(zip(*np.tril_indices(n))) 
indices = tf.constant([list(i) for i in indices], dtype=tf.int64) 

# Test values to load into matrix 
test = tf.constant(np.random.normal(0, 1, int(n*(n+1)/2)), dtype=tf.float64) 

# Can pass in list of values and indices to tf.sparse_to_dense 
# and it will return a dense matrix 
dense = tf.sparse_to_dense(sparse_indices=indices, output_shape=[n, n], \ 
          sparse_values=test, default_value=0, \ 
          validate_indices=True) 

sess.close() 
1

あなたはfill_lower_triangularでこれを行うことができます。

import numpy as np 
import tensorflow as tf 
from tensorflow.python.ops.distributions.util import fill_lower_triangular 
n = 4 
coeffs = tf.constant(np.random.normal(0, 1, int(n*(n+1)/2)), dtype=tf.float64) 
lower_diag = fill_lower_triangular(coeffs) 
関連する問題