Python np.subtract.outer()返回的维度比我预期的多
我有一个按日期索引的数据框,它有四列,都是整数 我的最终目标是创建另一个数据帧,它也按日期进行索引,并且不是有四列标量值,而是一个4x4数组,该数组包含该日期四列值之间差异的所有组合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
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]])