2

我想在 DataFrames 与 DataFrames、Dataframes 与 Series 和 Series 与 Series 之间使用 Python Pandas 强制矩阵乘法“方向”。

例如,我尝试了以下代码:

t = pandas.Series([1, 2])
print(t.T.dot(t))

输出:5

但我希望这样:

[1 2
 2 4]

Pandas 很棒,但是无法按照我想要的方式进行矩阵乘法是最令人沮丧的,因此我们将不胜感激。

PS:我知道 Pandas 试图隐式使用索引来找到计算矩阵乘积的正确方法,但似乎这种行为无法关闭!

4

3 回答 3

4

这里:

In [1]: import pandas

In [2]: t = pandas.Series([1, 2])

In [3]: np.outer(t, t)
Out[3]:
array([[1, 2],
       [2, 4]])
于 2013-04-09T03:21:48.867 回答
1

任何人现在可能想要考虑:pandas.Series.to_frame()。这有点笨拙。

这是原始问题的示例:

import pandas as pd

t = pd.Series([1, 2])

t.to_frame() @ t.to_frame().T
# or equivalently:
t.to_frame().dot(t.to_frame().T)

产生:

In [3]: t.to_frame().dot(t.to_frame().T)                                        
Out[3]: 
   0  1
0  1  2
1  2  4
于 2020-06-09T16:39:22.300 回答
0

yp 找到的解决方案:

https://github.com/pydata/pandas/issues/3344#issuecomment-16533461

from pandas.util.testing import makeCustomDataframe as mkdf
a=mkdf(3,5,data_gen_f=lambda r,c: randint(1,100))
b=mkdf(5,3,data_gen_f=lambda r,c: randint(1,100))
c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns)
print a
print b
print c
assert  (a.iloc[0,:].values*b.iloc[:,0].values.T).sum() == c.iloc[0,0]

C0       C_l0_g0  C_l0_g1  C_l0_g2  C_l0_g3  C_l0_g4
R0                                                  
R_l0_g0       39       87       88        2       65
R_l0_g1       59       14       76       10       65
R_l0_g2       93       69        4       29       58
C0       C_l0_g0  C_l0_g1  C_l0_g2
R0                                
R_l0_g0       76       88       11
R_l0_g1       66       73       47
R_l0_g2       78       69       15
R_l0_g3       47        3       40
R_l0_g4       54       31       31
C0       C_l0_g0  C_l0_g1  C_l0_g2
R0                                
R_l0_g0    19174    17876     7933
R_l0_g1    15316    13503     4862
R_l0_g2    16429    15382     7284

这里的断言是没用的,它只是检查它确实是一个正确的矩阵乘法。

这里的关键似乎是第 4 行:

c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns)

它的作用是计算 a 和 b 的点积,但强制生成的 DataFrame c 具有 a 的索引和 b 的列,确实将点积转换为矩阵乘法,并且采用 pandas 的风格,因为您保留了索引和列(你丢失了 a 的列和 b 的索引,但这在语义上是正确的,因为在矩阵乘法中你是对这些行求和,所以保留它们是没有意义的)。

这有点尴尬,但如果它与 API 的其余部分一致,这似乎很简单(我仍然需要测试 Series x Dataframe 和 Series x Series 的结果,我将在这里发布我的发现)。

于 2013-04-20T01:43:38.583 回答