我有一个矩形(不能假设是正方形)熊猫数据帧的数字。假设我选择一个对角线方向(从左上到右下或从右上到下左)。我想计算一个序列,它的条目是原始数据帧沿着所选的一组平行对角线的值的和。要完全指定目标,您需要确定对角线是“锚定”在左侧还是“锚定”在右侧。对于下面的,我假设它们是“锚定”在左边。在
我可以毫不费力地做到:
import numpy as np
import pandas as pd
rectdf = pd.DataFrame(np.arange(15).reshape(5,3))
# result:
0 1 2
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14
我可以计算“从左上到右下”的对角线和,如下所示:
^{pr2}$我可以通过将shift(-i)
翻转到{
urllsums = pd.concat([rectdf.iloc[:, i].shift(i) for i in range(rectdf.shape[1])], axis=1)\
.sum(axis=1, fillna=0)
# result:
0 0
1 4
2 12
3 21
4 30
这些结果都是正确的(也就是说,这段代码做了我想要的)。有没有更直接的方法来计算熊猫和纽比的总和?在
您可能正在寻找}来获得对角线向量documented here
numpy.trace()
(文档中的here)来直接获得跟踪,或者{首先,使用
rectdf.as_matrix()
将数据帧转换为numpy矩阵然后:
偏移量可以是正的也可以是负的,可以满足您所需的偏移量。在
例如,如果我们这样做:
^{pr2}$我们得到输出:
对于一般矩阵,我们需要从},也就是说,如果我们有一个变量
-(rows - 1)
到{rows
和一个变量columns
:简短回答
请看最后快速但复杂的函数。在
发展
对
trace
进行迭代是很好的,但我不确定它是否比pandas解决方案更好。这两种方法都涉及对角线或列上的迭代。从概念上讲,它更简单或更干净,但我不确定速度,尤其是在大型阵列上。在每条对角线有不同的长度,
[[12],[9,13],...]
。这是一个巨大的危险信号,警告我们块数组操作即使不是不可能的话也是困难的。在使用
scipy.sparse
我可以构造一个二维数组,该数组可以求和得到这些轨迹:这种稀疏格式将其
^{pr2}$data
存储在2d数组中,并进行必要的移位。事实上,你的pd.concat
产生了类似的结果:看起来
sparse
创建了这个data
数组,方法是从np.zeros
开始,并用适当的索引填充它:比如:
尽管我仍然需要一种为任何形状创建
i,j
的方法。对于j
来说,这很简单:重塑
i
让我用以下方法重现:
所以一起:
它需要对各种形状进行更多的测试。在
此函数比跟踪上的迭代更快,即使使用这个小尺寸的数组:
对于2D numpy数组
A
这可能是(?)对角线求和的最短代码:要求对角的和,可以
np.fliplr
数组。在相关问题 更多 >
编程相关推荐