在张量流中从向量创建二进制张量

时间:2017-12-14 14:52:39

标签: python numpy tensorflow

我从带有x整数条目的1D numpy数组N(或tensorflow tensor)开始。每个条目都小于或等于N。 我现在想要创建一个形状Y的张量(N,N)(即NxN矩阵),其中Y[i,j]=0如果x[i]!=x[j]Y[i,j]=1 x[i]==x[j] import numpy as np x=np.array([1,2,1,2,3,4,2]) Y=np.zeros((x.shape[0],x.shape[0])) for i in range(x.shape[0]): for j in range(x.shape[0]): if x[i]==x[j]: Y[i,j]=1

numpy示例:

array([[ 1.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.]])

输出

x

如何在纯张量流代码中有效地创建相同的函数?

并且:如果我有一个额外的批量维度,那么输入(B,N)具有形状Y并且我期望作为具有形状(B,N,N)的输出Observable.merge( Observable.interval(10 * 1000), Observable.fromEvent(this.myButton.nativeElement, 'click') ) .startWith(0) .subscribe(...) 。批次都是相互独立的。

2 个答案:

答案 0 :(得分:2)

x重塑为两种不同的形状,(B, 1, N)(B, N, 1),以便对它们进行适当的广播,然后比较这两个张量,结果就是{{1}所需的结果} 1True0

False

答案 1 :(得分:2)

import tensorflow as tf
x = tf.constant([1,2,1,2,3,4,2])
x = tf.expand_dims(x, axis=0)
x = tf.tile(x, [x.shape[1], 1])
x_ = tf.transpose(x)
Y = tf.where(tf.equal(x,x_), tf.ones_like(x), tf.zeros_like(x))

你有你的矢量x。您将dims扩展为具有矩阵[1,x.shape]。然后重复它以沿着线条获得相同矢量的副本。 x [i] == x [j]因此等于x == x_,其中x_是矩阵x的转置。

tf.where是条件张量。你给出了条件(x == x_),并且对于每个元素,如果它是真的,它将取第一个值(tf.ones_like),如果它是假,它将取第二个值({{1} })。那些tf.zeros_like函数生成的张量为0或1,其形状与x相同。