向量的点积

2024-06-11 08:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用熊猫系列做一个简单的计算 Z(2000,1)。W^T(1300)+B.T(1300)

当我执行点积W.Z时,我没有得到(2000,300)矩阵,但是:

dot_product = Z.dot(W.T)
ValueError: matrices are not aligned

当我执行加法时,我得到了一个类似的错误(向量不能被广播)。所以熊猫认为我的向量没有正确的形状,但我看不到罪魁祸首在哪里。我已经做了很多次这样的Numpy没有任何麻烦。。。我需要用Pandas来保存索引并获得一个索引数据帧

Z是形状框架(2000,1),具有时间索引:

                Z
2010-01-01 -0.135
2010-01-02  0.786
2010-01-03  0.099
2010-01-04 -0.332
2010-01-05 -0.097

W是形状(300,1)的索引框架:

        W
A1  0.344
B1  0.980
C1  0.099
D1  0.983
E1  0.873

B是与W具有相同索引和形状的数据帧


Tags: 数据numpy框架pandas错误not矩阵product
2条回答

您可以将第二个转置的数据帧转换为numpy数组,然后指定列名:

arr = np.sum(np.outer(Z.Z.to_numpy(), W.W.to_numpy()[:, None]), axis=1)
dot_product = pd.DataFrame(arr, index=Z.index, columns=['new'])
print (dot_product)
                 new
2010-01-01 -0.442665
2010-01-02  2.577294
2010-01-03  0.324621
2010-01-04 -1.088628
2010-01-05 -0.318063

dot_product = Z.dot(W.T.to_numpy()).sum(axis=1).to_frame('new')
print (dot_product)
                 new
2010-01-01 -0.442665
2010-01-02  2.577294
2010-01-03  0.324621
2010-01-04 -1.088628
2010-01-05 -0.318063
In [123]: S = pd.Series(np.arange(5))                                           
In [124]: W = pd.Series(np.arange(4))  

尽管有列显示,但系列是1d:

In [125]: S.shape                                                               
Out[125]: (5,)
In [126]: S.dot(S)                                                              
Out[126]: 30                   # the usual vector dot

S.dot(W)会由于大小不同而产生不匹配错误

与一维数组一样,转置不起任何作用:

In [127]: S.T.shape                                                               
Out[127]: (5,)
In [128]: S.T                                                                   
Out[128]: 
0    0
1    1
2    2
3    3
4    4
dtype: int64

使用newaxis进行索引将生成具有添加维度的数组:

In [134]: S[:,None]                                                             
Out[134]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])
In [135]: S[:,None]*W[None,:]    # (5,1) (1,4) broadcasting                                               
Out[135]: 
array([[ 0,  0,  0,  0],
       [ 0,  1,  2,  3],
       [ 0,  2,  4,  6],
       [ 0,  3,  6,  9],
       [ 0,  4,  8, 12]])

dot也做了同样的事情

S[:,None]*W.to_numpy()也起作用,但S[:,None]*W不起作用,这表明pandas不以同样的方式处理broadcasting。回溯显示pandas确实发送到numpy.ufunc,但有自己的包装器

相关问题 更多 >