【问题标题】:Packing array into lower triangular of a tensor将数组打包成张量的下三角形
【发布时间】:2016-09-15 09:45:55
【问题描述】:

我想将形状(..., 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()

有没有更好的方法来实现这一点?

【问题讨论】:

    标签: python indexing tensorflow


    【解决方案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)
    

    【讨论】:

    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多