我想使用Python Pandas强制矩阵乘法“定向”,在DataFrames对抗DataFrames,Dataframes对抗系列和系列对抗系列之间。
作为示例,我尝试了以下代码:
t = pandas.Series([1, 2])
print(t.T.dot(t))输出:5
但我希望是这样的:
[1 2
2 4]Pandas很棒,但是不能以我想要的方式做矩阵乘法是最令人沮丧的,所以任何帮助都会非常感谢。
PS:我知道Pandas试图隐式地使用索引来找到计算矩阵乘积的正确方法,但似乎这种行为无法关闭!
发布于 2020-06-10 00:39:22
现在任何人都可能想要考虑一下: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发布于 2013-04-09 11:21:49
这里:
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-20 09:43:39
Y-p找到的解决方案:
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的其余部分一致,则看起来很简单(我仍然需要测试x系列和x系列的结果,我会在这里发布我的发现)。
https://stackoverflow.com/questions/15889998
复制相似问题