Numpy массив в Тензор - PullRequest
       24

Numpy массив в Тензор

0 голосов
/ 20 сентября 2018

Я изменяю код, созданный Numpy, на код tenorflow.

Тем не менее, tenorflow не поддерживает указание каждого элемента (например, x [i] = 7), логический (например, .var [x <0.25)] = -1) с возможным массивом numpy Это сложно. </p>

Как мне изменить следующий код на тензор?

x=np.random.rand((500*300))
var=np.zeros((500*300), dtype=np.uint16)
var[x<.25] = -1
var[x>.75] = 1
S=var.reshape((500, 300))

Пожалуйста, помогите мне.

Примечание: я пробую этот шаг.

x=tf.random_uniform((500*300), minval=0, maxval=1, dtype=tf.float32)
var=tf.zeros((500*300), int16)
var[x<.25] = -1  # How is the change???????
var[x>.75] = 1   # How is the change???????
S=var.reshape((500, 300))

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я думаю, что если вы сгладите x и var, tf.scatter_update сможет это сделать.И тогда вы можете изменить его.

x = tf.random_uniform((5,3), minval=0, maxval=1, dtype=tf.float32)

var = tf.Variable(tf.zeros((5 , 3), tf.int32))

flattenx = tf.Variable(tf.reshape(x, [-1]))
flattenvar = tf.Variable(tf.reshape(var, [-1]))

minusone = tf.squeeze(tf.where(tf.less(flattenx, .25)))
plusone = tf.squeeze(tf.where(tf.greater(flattenx, .75)))

with tf.Session() as sess :

    sess.run(tf.global_variables_initializer())
    #create the required number of -1's using tile and update
    update = tf.scatter_update(flattenvar,
                               minusone,
                               tf.tile(tf.constant([-1],
                                       tf.int32),
                                       tf.shape(minusone)))
    #create the required number of 1's using tile and update
    update = tf.scatter_update(update,
                               plusone,
                               tf.tile(tf.constant([1],
                                       tf.int32),
                                       tf.shape(plusone)))
    print(sess.run(tf.transpose(tf.reshape(update,(3,5)))))
    print(sess.run(tf.transpose(tf.reshape(flattenx,(3,5)))))

Я так транспонирую, потому что, если я непосредственно изменю его в (5,3) позиции не совпадают.

Вывод это.

[[ 0  1 -1]
 [ 0  0 -1]
 [ 0  1  0]
 [ 1  0  1]
 [-1  0  0]]
[[0.53033566 0.8070284  0.0320853 ]
 [0.7295474  0.684116   0.18633509]
 [0.4942881  0.89346325 0.5873647 ]
 [0.96912587 0.5400375  0.8372116 ]
 [0.14598823 0.62156534 0.54353106]]
0 голосов
/ 20 сентября 2018

Используйте tf.where , как предлагается в комментариях.Ниже я привел пример кода и прокомментировал при необходимости.

x = tf.random_uniform(shape=[5, 3], minval=0, maxval=1, dtype=tf.float32)

#same shape as x and only contains -1
c1 = tf.multiply(tf.ones(x.shape, tf.int32), -1)
#same shape as x and only contains 1
c2 = tf.multiply(tf.ones(x.shape, tf.int32), 1)

var = tf.zeros([5, 3], tf.int32)

#assign 1 element wise if x< 0.25 else 0
r1 = tf.where(tf.less(x, 0.25), c1, var)
#assign -1 element wise if x> 0.75 else 0
r2 = tf.where(tf.greater(x, 0.75), c2, var)

r = tf.add(r1, r2)

with tf.Session() as sess:
    _x, _r = sess.run([x, r])

    print(_x)
    print(_r)

Пример результата

[[0.6438687  0.79183984 0.40236235]
 [0.7848805  0.0117377  0.6858672 ]
 [0.6067281  0.5176437  0.9839716 ]
 [0.15617108 0.28574145 0.31405795]
 [0.28515983 0.6034068  0.9314337 ]]

[[ 0  1  0]
 [ 1 -1  0]
 [ 0  0  1]
 [-1  0  0]
 [ 0  0  1]]

Надеюсь, это поможет.

...