Python np.subtract.outer()返回的维度比我预期的多

Python np.subtract.outer()返回的维度比我预期的多,python,numpy,pandas,Python,Numpy,Pandas,我有一个按日期索引的数据框,它有四列,都是整数 我的最终目标是创建另一个数据帧,它也按日期进行索引,并且不是有四列标量值,而是一个4x4数组,该数组包含该日期四列值之间差异的所有组合 A B C D 1/1/2013 7 -1 1 2 我想制作一个2d数组,如下所示: A B C D 7 -1 1 2 A 7 0 8 6 5 B -1 -8 0 -2 -3

我有一个按日期索引的数据框,它有四列,都是整数

我的最终目标是创建另一个数据帧,它也按日期进行索引,并且不是有四列标量值,而是一个4x4数组,该数组包含该日期四列值之间差异的所有组合

           A   B    C   D
1/1/2013    7   -1  1   2
我想制作一个2d数组,如下所示:

        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
这将返回:

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.]]]]
rcdf是类型、形状(1,4)
[[[[ 0.  8.  6.  5.]]
[[-8.  0. -2. -3.]]
[[-6.  2.  0. -1.]]
[[-5.  3.  1.  0.]]]]

不知道为什么会出现这种奇怪的形状(1,4)。我在期待(4,4)。看看rcdf的打印图,我可以看到它被重重地包裹在多个阵列中。我猜我用错了外部函数。我想用正确的方法来做这件事,而不是使用丑陋的重塑黑客来拉出(正确的)数据,但将其重新打包成正确的形状。

通过选择第一行,然后使用,可以将2D输入数据帧转换为1D系列,如下所示-

np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0])
看来你也可以用-

样本运行-

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]])

谢谢一个令人困惑的问题是,“数组”实际上是数据帧中的一行。ravel()只适用于np.array,因此我需要弄清楚如何遍历数据帧,并将每个索引行视为np.array。(就此问题单独提问)@user3556757-您可以使用
.values
从一行中获取数据,在您的示例中,该行是一个numpy数组。
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]])