“张量”对象不支持项目分配,而需要切片然后在张量数组中进行assignmnet

时间:2019-06-11 21:19:55

标签: python numpy tensorflow

我想找到张量的一部分,然后为其分配一个常数,但是我收到了此错误。 似乎在张量流中不允许分配张量。考虑到这一点,任何人都不知道我该如何完成这项任务?

例如,如果张量是这样的:

tf_a2 = tf.Variable(([[2, 5, 1, 4, 3],
                      [1, 6, 4, 2, 3],
                      [0, 0, 0, 6, 6],
                      [2, 1, 1, 3, 3],
                      [4, 4, 1, 2, 3]]))

我想查找每行中具有相同值的元素,然后用N替换任何元素,除了左起的第一个元素。

例如,在上面的示例中,在row = 3中,三个元素= 0,因此 我将最左边的元素保持原样,然后使用N用相同的值替换右边的元素。在同一行中,有两个具有6个值的元素,我保留了最左边的元素,并用N替换了所有具有相同值的元素。

在row = 4中,重复1次,我再次保留最左边的一个,并替换任何具有相同值的右边的项目。

在行= 5中,将4重复两次。我保留最左边的项目,然后用N用相同的值替换之后的任何项目。

所以对于N = 9,结果将是:

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

我在下面的numpy中有正确的代码:

  numpy code:  (a2[:,1:])[a2[:,1:]==a2[:,:-1]] = N

但是我需要在tensorflow中完成它,尽管它仍然引发相同的错误,但我尝试了以下代码:

tf.where(tf.equal(a2[:,1:], a2[:, :-1]),N,a2[:,1:])

The error:
    a2[:,1:][a2[:,1:]==a2[:,:-1]] = N
TypeError: 'Tensor' object does not support item assignment

我还在这里查看了具有相同错误的链接,但是他们提出了一个完全针对与我的代码不匹配的编码的解决方案。

提前谢谢

1 个答案:

答案 0 :(得分:1)

如错误消息所述,“'张量'对象不支持项目分配”。但是至少有一种解决方法。一种方法是逐元素地将要更改的每个元素乘以零(在原始矩阵中),然后创建一个具有所有元素零而不需要更改的新矩阵(相同形状)。然后,您可以将它们加在一起以获得所需的矩阵。

如果我了解您对此特定情况正确的解决方案,那么您始终想忽略第一列吗?如果是这样的话,我认为这个tensorflow解决方案应该适合您(已针对tensorflow 1.13.1版进行了测试和验证)。

import tensorflow as tf
tf.enable_eager_execution()

tf_a2 = tf.Variable(([[2, 5, 1, 4, 3],
                      [1, 6, 4, 2, 3],
                      [0, 0, 0, 6, 6],
                      [2, 1, 1, 3, 3],
                      [4, 4, 1, 2, 3]]))

N=9

first_col_change = tf.zeros([tf_a2.shape[0],1], dtype=tf.int32)
last_cols_change = tf.cast(tf.equal(tf_a2[:,1:], tf_a2[:, :-1]),tf.int32)
change_bool = tf.concat([first_col_change, last_cols_change],axis=-1)
not_change_bool = 1-change_bool
tf_a2_changed = tf_a2*not_change_bool + change_bool*N

print(tf_a2_changed)

给出输出:

tf.Tensor(
[[2 5 1 4 3]
 [1 6 4 2 3]
 [0 9 9 6 9]
 [2 1 9 3 9]
 [4 9 1 2 3]], shape=(5, 5), dtype=int32)