python - 有效地将 3d 数组中的值连接到 2d 数组
问题描述
我有一个 3 维数组A
,我想对其中一个轴的值求和并创建一个包含总和的 2d 数组。
这可以通过使用循环遍历 3d 数组来天真地完成,但这样做非常慢。
A = np.sum(A,axis=0)
可以比天真的方式更快地实现这一点,但是有更快的方法吗?
我在 Matlab 中找到了这个答案:https ://www.mathworks.com/matlabcentral/answers/3643-efficiently-converting-a-3d-matrix-to-a-2d-matrix
我想知道在 Python 中是否有类似的有效方法可以做到这一点。
以下是我正在寻找的内容:
A = np.ones((3, 3, 3))
# numpy magic ...
print (A)
/**********
* [3, 3, 3],
* [3, 3, 3],
* [3, 3, 3]
***********/
解决方案
我认为你最好的选择是使用方法ndarray.sum
而不是np.sum
. 内部处理将是相同的,但是当您使用该方法时,您不需要检查传入的对象是否已经是一个数组并可能转换它。话虽如此,开销的差异非常小。
内部循环已经用 C 语言编写并尽可能优化。我能想到的唯一额外改进是沿连续轴求和总是最快的。您可以通过使用类似的东西来确保这一点np.moveaxis
,copy
以保证连续性:
def fastsum(x, axis):
if x.strides[axis] != x.itemsize:
x = np.moveaxis(x, axis, -1).copy(order="C")
axis = -1
return x.sum(axis)
这个功能不是很有效。对于小型数组,任何收益都可能被 python 和 numpy 对象协议的开销所淹没。最好的办法是确保以正确的顺序生成数组,并仅x.sum(-1)
在 C 连续数组或x.sum(0)
Fortran 连续数组上使用。
推荐阅读
- powerquery - 在 Power Query 中,根据值是否存在于另一列中填充列
- android - 我有一个固定在底部栏的 FAB,它有错误的行为
- wordpress - 让用户的总订单在某个值之间
- python - Plotting vertical lines in matplotlib.animation over a scatter plot
- c# - C# Serilog conditional logging if one fails?
- reactjs - How to pass props to child component based on dynamic route
- reactjs - React Table: column resizing NOT real-time?
- r - 有没有办法使用具有不同列数和行数的两个不同数据集在 ggplot 中绘制标签?
- pdf - Why is my PDF showing multiple sheets from my workbook?
- python - How can scatter_std influence the value of the weights in a GNN programmed with pytorch?