在Tensorflow中执行此基于切片的乘法的最有效方法

时间:2017-06-11 05:25:21

标签: numpy tensorflow slice

我正在尝试执行将2D矩阵切片乘以常数的操作。

例如,如果我想将除前2列之外的所有内容相乘

要在numpy中执行此操作,可以执行以下操作:

a = np.array([[0,7,4],
              [1,6,4],
              [0,2,4],
              [4,2,7]])
a[:, 2:] = 2.0*a[:, 2:]

>> a
>> array([[ 0,  7,  8],
          [ 1,  6,  8],
          [ 0,  2,  8],
          [ 4,  2, 14]])

然而,至少从我搜索过的内容来看,tensorflow目前还没有直接的方法来做到这一点。

我目前的解决方案是将 a 最初创建为两个单独的张量a1和a2,将第二个乘以2.0,然后将它们连接到轴= 1。操作很简单,这是可能的。但是我有两个问题

  1. 这是最有效的方法吗
  2. 是否有更好的(一般/有效)方式来执行此操作以使功能更接近numpy的切片魔术(可能https://www.tensorflow.org/api_docs/python/tf/scatter_

1 个答案:

答案 0 :(得分:3)

一种选择是执行逐步乘法,如下所示:

import tensorflow as tf

a = tf.Variable(initial_value=[[0,7,4],[1,6,4],[0,2,4],[4,2,7]])
b = tf.mul(a,[1,1,2])

s=tf.InteractiveSession()
s.run(tf.global_variables_initializer())
b.eval()

打印

array([[ 0,  7,  8],
       [ 1,  6,  8],
       [ 0,  2,  8],
       [ 4,  2, 14]])

更一般地说,如果a有更多列,您可以执行以下操作:

import tensorflow as tf

a = tf.Variable(initial_value=[[0,7,4],[1,6,4],[0,2,4],[4,2,7]])
b = tf.mul(a,[1,1]+[2 for i in range(a.get_shape()[1]-2)])

s=tf.InteractiveSession()
s.run(tf.global_variables_initializer())
b.eval()

或者,如果你的矩阵有很多列,你可以替换

b = tf.mul(a,[1,1]+[2 for i in range(a.get_shape()[1]-2)])

import numpy as np
b = tf.mul(a,np.concatenate((np.array([1,1]),2*np.ones(a.get_shape()[1]-2))))