Python 布尔屏蔽(2D,2D)给出1D结果

Python 布尔屏蔽(2D,2D)给出1D结果,python,python-3.x,tensorflow,mask,tensor,Python,Python 3.x,Tensorflow,Mask,Tensor,问题 src = [1, 2, 3, 4, 5, 6, 7, 8, 9] src = tf.ones([tf.shape(src)[0], 1], tf.int32) * src matrix = tf.ones_like(src, tf.int32) matrix = tf.matrix_band_part(matrix, 3, 3) # number for mask is arbitrary mask = tf.cast(matrix, tf.bo

问题

    src = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    src = tf.ones([tf.shape(src)[0], 1], tf.int32) * src

    matrix = tf.ones_like(src, tf.int32)
    matrix = tf.matrix_band_part(matrix, 3, 3) # number for mask is arbitrary
    mask = tf.cast(matrix, tf.bool)

    ret = tf.boolean_mask(tensor=src, mask=mask)
看起来相对简单:它从不匹配条件的张量中删除值。如果遮罩的尺寸与目标张量相同,则条件在元素方面起作用

使用
ret=tf.boolean\u mask(src,mask)
,我发现输出维度与输入维度不匹配

src:    Tensor("mul_3:0", shape=(?,?), dtype=int32)
mask:   Tensor("Cast_1:0", shape=(?,?), dtype=int32)
ret:    Tensor("boolean_mask/Gather:0", shape=(?,), dtype=int32)
请注意,
(?,)
的行为与
(?,?)
不同,尽管我不确定原因或方式


代码

    src = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    src = tf.ones([tf.shape(src)[0], 1], tf.int32) * src

    matrix = tf.ones_like(src, tf.int32)
    matrix = tf.matrix_band_part(matrix, 3, 3) # number for mask is arbitrary
    mask = tf.cast(matrix, tf.bool)

    ret = tf.boolean_mask(tensor=src, mask=mask)

问题出在哪里?

请参阅:

(N-K+1)-由张量中的条目填充的维张量 对应于掩码中的真值


其中
N
src
的维度,
K
mask
的维度,当
N=K
时,返回值总是1D,这就是您的情况。

非常感谢您。我接受这个答案。您对如何执行我尝试执行的操作(基于二维掩码过滤二维矩阵)有何建议?您可以使用布尔掩码从二维数组中删除零,但不能保证结果仍然是二维的。例如,对于
[[1,0],[2,3]]
,删除零后将有
[1,2,3]
,但它不适合作为2D数组或矩阵.Hm。如何从[[1,0],[2,3]]到[[1],[2,3]]?我试着使用
tf.gather(src,tf.not_equal(src,0))
…做了类似的工作吗?我怀疑你是否可以用那种方式得到张量(通常是平方的)<代码>tf。常数([[1],[2,3]])例如给出了一个错误。