Til*_*ann 5 python indexing tensorflow
我想包形状的阵列(..., 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]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经能够实现在使用的组合tensorflow类似的东西transpose,reshape和scatter_update但感觉笨拙。
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()
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?
我意识到这有点晚了,但我一直在尝试加载下三角矩阵,并且我使用稀疏到密集使其工作:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1656 次 |
| 最近记录: |