我从带有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(...)
。批次都是相互独立的。
答案 0 :(得分:2)
将x
重塑为两种不同的形状,(B, 1, N)
和(B, N, 1)
,以便对它们进行适当的广播,然后比较这两个张量,结果就是{{1}所需的结果} 1
和True
为0
:
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相同。