在 TensorFlow 中,如何从具有 python 的张量中获取非零值及其索引?

In TensorFlow, how can I get nonzero values and their indices from a tensor with python?

我想做这样的事情。
假设我们有一个张量 A。

A = [[1,0],[0,4]]

我想从中获取非零值及其索引。

Nonzero values: [1,4]  
Nonzero indices: [[0,0],[1,1]]

Numpy中也有类似的操作
np.flatnonzero(A) return 在扁平 A 中非零的索引。
x.ravel()[np.flatnonzero(x)]根据非零索引提取元素。
这是这些操作的 a link

如何使用 python 在 Tensorflow 中执行上述 Numpy 操作?
(矩阵是否展平并不重要。)

您可以使用 not_equal and where 方法在 Tensorflow 中获得相同的结果。

zero = tf.constant(0, dtype=tf.float32)
where = tf.not_equal(A, zero)

where 是与 A 具有相同形状的张量,其中包含 TrueFalse,在以下情况下

[[True, False],
 [False, True]]

这足以 select 来自 A 的零或非零元素。如果你想获得指数,你可以使用 where 方法如下:

indices = tf.where(where)

where 张量有两个 True 值,因此 indices 张量将有两个条目。 where 张量的秩为 2,因此条目将有两个索引:

[[0, 0],
 [1, 1]]
#assume that an array has 0, 3.069711,  3.167817.
mask = tf.greater(array, 0)
non_zero_array = tf.boolean_mask(array, mask)

使用稀疏张量怎么样。

>>> A = [[1,0],[0,4]]
>>> sparse = tf.sparse.from_dense(A)
>>> sparse.values.numpy(), sparse.indices.numpy()
(array([1, 4], dtype=int32), array([[0, 0],
        [1, 1]]))