我想创建一个形状为(3,4,2,2)的零张量,并在两个(3,1)张量给定的位置上插入一个(3,4)张量。
示例代码:对数组的等效numpy操作如下:
# Existing arrays of required shapes
bbox = np.arange(3*4).reshape(3,4)
x = np.array([0,0,1])
y = np.array([1,1,1])
# Create zeros array and assign into it
output = np.zeros((3,4,2,2))
output[np.arange(3),:,x,y] = bbox
如何使用Tensorflow做类似的事情?
注意:我实际上想使用张量大小(32,125,32,32)的张量。上面是简单的复制代码
答案 0 :(得分:1)
您可以使用tf.scatter_nd
来做到这一点:
import tensorflow as tf
import numpy as np
bbox = np.arange(3 * 4).reshape(3, 4)
x = np.array([0, 0, 1])
y = np.array([1, 1, 1])
x_size = 2
y_size = 2
# TensorFlow calculation
with tf.Graph().as_default(), tf.Session() as sess:
bbox_t = tf.convert_to_tensor(bbox)
x_t = tf.convert_to_tensor(x)
y_t = tf.convert_to_tensor(y)
shape = tf.shape(bbox_t)
rows, cols = shape[0], shape[1]
ii, jj = tf.meshgrid(tf.range(rows), tf.range(cols), indexing='ij')
xx = tf.tile(tf.expand_dims(x_t, 1), (1, cols))
yy = tf.tile(tf.expand_dims(y_t, 1), (1, cols))
idx = tf.stack([ii, jj, xx, yy], axis=-1)
output = tf.scatter_nd(idx, bbox_t, [rows, cols, x_size, y_size])
output_tf = sess.run(output)
# Test with NumPy calculation
output_np = np.zeros((3, 4, 2, 2))
output_np[np.arange(3), :, x, y] = bbox
print(np.all(output_tf == output_np))
# True