将矩阵的严格上三角形部分转换为Tensorflow中的数组

时间:2017-01-06 21:34:23

标签: python tensorflow

我试图将矩阵的严格上三角形部分转换为Tensorflow中的数组。这是一个例子:

输入:

FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot rootView = context.getViewRoot();
SelectOneMenu yesNoDropdown = (SelectOneMenu) rootView.findComponent("formId:yes-no");
yesNoDropdown.setValue("no");
RequestContext.getCurrentInstance().update("formId");

输出:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

我尝试了以下代码,但它无法正常工作(报告错误):

[2, 3, 6]

谢谢!

3 个答案:

答案 0 :(得分:7)

以下答案紧跟@Cech_Cohomology的答案,但在此过程中不使用Numpy,只有TensorFlow。

import tensorflow as tf

# The matrix has size n-by-n
n = 3

# A is the matrix
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ones = tf.ones_like(A)
mask_a = tf.matrix_band_part(ones, 0, -1) # Upper triangular matrix of 0s and 1s
mask_b = tf.matrix_band_part(ones, 0, 0)  # Diagonal matrix of 0s and 1s
mask = tf.cast(mask_a - mask_b, dtype=tf.bool) # Make a bool mask

upper_triangular_flat = tf.boolean_mask(A, mask)

sess = tf.Session()
print(sess.run(upper_triangular_flat))

输出:

[2 3 6]

此方法的优点是,在运行图表时,无需提供feed_dict

答案 1 :(得分:0)

我终于想出了如何使用Tensorflow来做到这一点。

我们的想法是将占位符定义为布尔掩码,然后使用numpy将布尔矩阵传递给运行时中的布尔掩码。我在下面分享我的代码:

import tensorflow as tf
import numpy as np

# The matrix has size n-by-n
n = 3
# define a boolean mask as a placeholder
mask = tf.placeholder(tf.bool, shape=(n, n))
# A is the matrix
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    npmask = np.triu(np.ones((n, n), dtype=np.bool_), 1)
    A_upper_triangular = tf.boolean_mask(A, mask)
    print(sess.run(A_upper_triangular, feed_dict={mask: npmask}))

我的Python版本是3.6,而我的Tensorflow版本是0.12.0rc1。上面代码的输出是

[2, 3, 6]

这种方法可以进一步推广。我们可以使用numpy构造任何类型的蒙版,然后将蒙版传递给Tensorflow以提取感兴趣的张量部分。

答案 2 :(得分:-1)

如果您使用的是python 2.7,那么对于NxN元素数组,您可以使用带有条件的列表推导:

def upper_triangular_to_array(A):
    N = A.shape[0]
    return np.array([p for i, p in enumerate(A.flatten()) if i > (i / N) * (1 + N)])

此函数要求A是一个二维方形numpy数组,以返回正确的结果。它还依赖于整数的分区,如果你使用python 3.x

,你需要纠正它