【发布时间】:2015-08-12 16:07:31
【问题描述】:
我有一个形状为 (4, 3) 的数据框,如下所示:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: x = pd.DataFrame(np.random.randn(4, 3), index=np.arange(4))
In [4]: x
Out[4]:
0 1 2
0 0.959322 0.099360 1.116337
1 -0.211405 -2.563658 -0.561851
2 0.616312 -1.643927 -0.483673
3 0.235971 0.023823 1.146727
我想将数据框的每一列与形状为 (4,) 的 numpy 数组相乘:
In [9]: y = np.random.randn(4)
In [10]: y
Out[10]: array([-0.34125522, 1.21567883, -0.12909408, 0.64727577])
在 numpy 中,以下广播技巧起作用:
In [12]: x.values * y[:, None]
Out[12]:
array([[-0.32737369, -0.03390716, -0.38095588],
[-0.25700028, -3.11658448, -0.68303043],
[-0.07956223, 0.21222123, 0.06243928],
[ 0.15273815, 0.01541983, 0.74224861]])
但是,它在 pandas 数据帧的情况下不起作用,我收到以下错误:
In [13]: x * y[:, None]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-21d033742c49> in <module>()
----> 1 x * y[:, None]
...
ValueError: Shape of passed values is (1, 4), indices imply (3, 4)
有什么建议吗?
谢谢!
【问题讨论】:
-
您的代码对我来说运行良好。也许是版本差异?
pd.__version__: '0.16.1' np.__version__: '1.9.2' -
如果我写
x.values * y[:, None]而不是x * y[:, None]这对我有用,这就是你的行中的In [13]。 -
我正在使用以下版本:pd.__version__: '0.16.2', np.__version__: '1.9.2'。
-
我刚刚在一台机器上尝试过这个,pandas 版本:0.15.0 和 numpy 版本 1.8.0。此操作 (x * y[:, None]) 仍然不起作用。我怀疑这是由 pandas 或 numpy 版本引起的问题。
标签: python numpy pandas array-broadcasting