【问题标题】:Python equivalent of (matrix)*(vector) in RR 中 (matrix)*(vector) 的 Python 等价物
【发布时间】:2020-10-14 03:42:22
【问题描述】:

在 R 中,当我执行以下代码时:

> X=matrix(1,2,3)
> c=c(1,2,3)
> X*c

R 给出以下输出:

     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

但是当我在 Python 上执行以下操作时:

>>> import numpy as np
>>> X=np.array([[1,1,1],[1,1,1]]) 
>>> c=np.array([1,2,3])
>>> X*c

上面的 Python 代码给出以下输出:

array([[1, 2, 3],
       [1, 2, 3]])

有什么方法可以让 Python 提供与 R 相同的输出?我想我必须以某种方式告诉 Python 我希望 numpy 将矩阵 X 的每个元素乘以向量 c 沿列而不是沿行的每个元素,但我不知道该怎么做关于这个。

【问题讨论】:

  • 在R 中,您正在回收向量 'c' 。它正在按列进行回收
  • 是的,但是有什么方法可以从 Python 获得相同的输出(对于给定的矩阵 X 和向量 c)?
  • 也许this 可能会有所帮助
  • @akrun 谢谢你的链接。 Python numpy 的 itertools --> 产品等价物是什么? Python numpy 是否存在这种情况?
  • 如何使用 2 个长度为 3 的数组产生 (2,3) 结果?

标签: python r numpy matrix vector


【解决方案1】:
In [18]: np.reshape([1,2,3]*2,(2,3),order='F')                                  
Out[18]: 
array([[1, 3, 2],
       [2, 1, 3]])

这是从列表乘法开始的,也就是复制:

In [19]: [1,2,3]*2                                                              
Out[19]: [1, 2, 3, 1, 2, 3]

其余的使用numpy 将其重塑为 (2,3) 数组,但连续值向下,'F' 顺序。

不知道R,尤其是c(1,2,3) 表达式,我不能说这就是R 中发生的事情。

===

您谈论带有列的行,但我看不出在您的示例中它是如何工作的。也就是说,我们可以轻松执行outer 类似产品

===

这会重现您的R_Product(至少在一些测试用例中):

In [138]: def foo(X,c): 
     ...:     X1 = X.ravel() 
     ...:     Y = np.resize(c,X1.shape)*X1 
     ...:     return Y.reshape(X.shape, order='F') 
     ...:                                                                       
In [139]: foo(np.ones((2,3)),np.arange(1,4))                                    
Out[139]: 
array([[1., 3., 2.],
       [2., 1., 3.]])
In [140]: foo(np.arange(6).reshape(2,3),np.arange(1,4))                         
Out[140]: 
array([[ 0,  6,  8],
       [ 2,  3, 15]])

我正在使用resize 函数复制c 以匹配X 的元素总数。和order F 按所需的列顺序堆叠它们。 numpy 的默认值是订单 C。

在numpy 中,复制一个数组以匹配另一个数组并不常见,至少在这个意义上不常见。像广播一样,按行或列复制是很常见的。当然还有重塑。

【讨论】:

    【解决方案2】:

    我是 OP。 我一直在寻找一个快速简单的解决方案,但我想 Python 中没有直接的功能可以让我们做到这一点。因此,我必须创建一个函数,以与 R 相同的方式将矩阵与向量相乘:

    def R_product(X,c):
    
    """
    Computes the regular R product 
    (not same as the matrix product) between 
    a 2D Numpy Array X, and a numpy vector c.
    
    Args:
       X: 2D Numpy Array
       c: A Numpy vector
    
    Returns: the output of X*c in R. 
             (This is different than X/*/c in R)
    """
        X_nrow = X.shape[0]
        X_ncol = X.shape[1]
        X_dummy = np.zeros(shape=((X_nrow * X_ncol),1))
        nrow = X_dummy.shape[0]
        nc = nrow // len(c)
        Y = np.zeros(shape=(nrow,1))
    
        for j in range(X_ncol):
            for u in range(X_nrow):
                X_element = X[u,j]
                    
                if u == X_nrow - 1:
                    idx = X_nrow * (j+1) - 1 
                else:
                    idx = X_nrow * j + (u+1) - 1
                        
                X_dummy[idx,0] = X_element
    
        for i in range(nc):
            for j in range(len(c)):
                Y[(i*len(c)+j):(i*len(c)+j+1),:] = (X_dummy[(i*len(c)+j):(i*len(c)+j+1),:]) * c[j]
         
        for z in range(nrow-nc*len(c)):
            Y[(nc*len(c)+z):(nc*len(c)+z+1),:] = (X_dummy[(nc*len(c)+z):(nc*len(c)+z+1),:]) * c[z]
    
        return Y.reshape(X_ncol, X_nrow).transpose() # the answer I am looking for
    
    

    应该可以。

    【讨论】:

    • 与我在原帖中描述的 X 和 c 相同....我很确定它也适用于任意 X 和 c..这里,X 代表 2D Numpy Array ,而 c 是一个 numpy 向量
    • 我在最终编辑之前测试了你的功能。这种复制数组以匹配另一个数组的方式有多普遍?这在numpy 中是不正常的,尽管正如我所展示的那样并不难。我建议改为学习broadcasting。
    猜你喜欢
    • 2016-12-19
    • 2020-09-14
    • 2018-07-18
    • 2016-06-14
    • 2016-05-23
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多