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

Numpy 在Tensorflow中执行此基于切片的乘法的最有效方法,numpy,tensorflow,slice,Numpy,Tensorflow,Slice,我试图执行一个二维矩阵的切片乘以常数的运算 例如,如果我想将前两列以外的所有列相乘 要在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],

我试图执行一个二维矩阵的切片乘以常数的运算

例如,如果我想将前两列以外的所有列相乘

要在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上。操作非常简单,这是可能的。不过,我有两个问题

  • 这是最有效的方法吗
  • 有没有更好(通用/高效)的方法来实现这一点,从而使功能更接近numpy的切片魔法(也许

  • 一个选项是执行入口乘法,如下所示:

    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)])
    


    嘿,米里亚姆,谢谢你的选择。你如何将其推广到一个可变的第二维度?例如,如果a.shape=(N,D)。你需要定义[1,1,2,2,2,2……2]@miriamfaber谢谢你的更新!它看起来不错(虽然tf.mul是tf.matmul)我想知道你为什么用numpy来表示常量数组而不是tensorflowequivalents@undercurrent你也可以使用tf.ones,我只是忘记了它的存在。请注意,tf.matmul和tf.mul是不同的。前者是通常的矩阵乘法,而后者是一个entrywise乘积。在我的回答中,我使用了la谢谢你的澄清。re:matmul(哦!)我本想写tf.multiply()
    import numpy as np
    b = tf.mul(a,np.concatenate((np.array([1,1]),2*np.ones(a.get_shape()[1]-2))))