np.subtract.outer()返回的维度超出了我的预期

时间:2015-10-08 06:46:52

标签: python numpy pandas

我有一个按日期索引的数据框,有四列,全部是整数。

我的最终目标是创建另一个数据帧,它也按日期索引,而不是有四列标量值,是一个4x4数组,它具有四列之间差异的所有组合'该日期的价值观。

           A   B    C   D
1/1/2013    7   -1  1   2

我想制作一个看起来像的二维数组:

        A   B   C   D
        7   -1  1   2
A   7   0   8   6   5
B   -1  -8  0   -2  -3
C   1   -6  2   0   -1
D   2   -5  3   1   0

其中数据的值是列之间差异的组合'值。

然后我为原始数据框中的每个日期制作这个2d数组

我一直在努力做到这一点' pythonically / panda-ly'没有严重的循环和事情。

我提出了最简单的案例 - 原始数据框只有一行数据:

ddf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4)
            A  B  C  D
2013-01-02  7 -1  1  2

我将ddf输入

def makeRelativeChangeDF(deltaDF):
    """return array wit all the combinations of differences between columns"""
    return np.subtract.outer(deltaDF, deltaDF)

返回:

rcdf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4)
[[[[ 0.  8.  6.  5.]]

  [[-8.  0. -2. -3.]]

  [[-6.  2.  0. -1.]]

  [[-5.  3.  1.  0.]]]]

不确定为什么这会产生奇怪的形状(1,4)。我期待(4,4)。看看rcdf的印刷品,我可以看到它被多个阵列包裹着。我想我错误地使用了外部函数。我想以正确的方式做到这一点,而不是使用丑陋的重塑黑客来拉出(正确的)数据,但重新打包成正确的形状。

1 个答案:

答案 0 :(得分:1)

您可以通过选择.iloc[0]的第一行然后使用np.subtract.outer()将2D输入数据帧转换为1D系列,就像这样 -

np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0])

您似乎也可以使用broadcasting -

deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:]

示例运行 -

In [107]: type(deltaDF)
Out[107]: pandas.core.frame.DataFrame

In [108]: np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0])
Out[108]: 
array([[ 0,  8,  6,  5],
       [-8,  0, -2, -3],
       [-6,  2,  0, -1],
       [-5,  3,  1,  0]])

In [109]: deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:]
Out[109]: 
array([[ 0,  8,  6,  5],
       [-8,  0, -2, -3],
       [-6,  2,  0, -1],
       [-5,  3,  1,  0]])