Skip to main content
 首页 » 编程设计

python之在 tensorflow 中“分配”二维 block 切片

2024年10月01日33qq78292959

tensorflow 是否提供了一种创建零张量的方法,同时用另一个切片替换一般切片?特别是,我需要在矩阵张量中分配二维 block 。这是我需要实现的示例:

给定一个可变形状的张量,例如。

[1 2 3 
 4 5 6], 

和定义切片的另一个张量,例如。

[0 0 0 0 0 
 0 1 1 1 0 
 0 1 1 1 0], 

新的张量应该如下所示:

[0 0 0 0 0 
 0 1 2 3 0 
 0 4 5 6 0]. 

我知道有 scatter_nd,但它似乎只能沿整个轴“替换”值。我是否遗漏了任何操作或是否有任何解决方法来实现此目的?

请您参考如下方法:

您可以在 y 的适当切片上使用 assign:

import numpy as np 
import tensorflow as tf 
 
x = tf.constant([[1,2,3],[4,5,6]]) 
y = tf.Variable([[0,0,0,0,0],[0,1,1,1,0],[0,1,1,1,0]]) 
 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 
 
z = y[1:,1:4].assign(x) 
z.eval() 
 
# returns 
# array([[0, 0, 0, 0, 0], 
#        [0, 1, 2, 3, 0], 
#        [0, 4, 5, 6, 0]]) 

编辑

动态相同的东西(这里只针对位置)

import numpy as np 
import tensorflow as tf 
 
x = tf.constant([[1,2,3],[4,5,6]]) 
y = tf.Variable([[0,0,0,0,0],[0,1,1,1,0],[0,1,1,1,0]]) 
 
pos = tf.placeholder(tf.int32, shape=(2,)) 
 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 
 
z = y[pos[0]:2+pos[0],pos[1]:3+pos[1]].assign(x) 
z.eval({pos: [1,1]})