gpt4 book ai didi

arrays - Numpy 中的分块操作

转载 作者:行者123 更新时间:2023-12-04 04:04:22 25 4
gpt4 key购买 nike

是否有任何方便的实用程序可用于对 Numpy 数组进行分 block 操作?

我正在考虑像 Ising 自旋重整化这样的操作,您将矩阵划分为 block 并返回矩阵,其中每个 block 被其总和、平均值或其他函数替换。

最佳答案

您可能正在寻找 superbatfish's blockwise_view .这使用 np.lib.stride_tricks.as_strided创建数组的 View ,将数组的“ block ”放置在它们自己的轴上。

例如,假设您有一个二维数组,例如,

In [97]: arr = np.arange(24).reshape(6, 4)

In [98]: arr.shape
Out[98]: (6, 4)

In [99]: arr
Out[99]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])

并且您希望将其“切碎”成 4 block 形状 (3, 2)。你可以使用
blockwise_view 将其转换为形状为 (4, 3, 2) 的 4D 数组:
In [34]: blocked = blockwise_view(arr, (3, 2)); blocked
Out[34]:
array([[[[ 0, 1],
[ 4, 5],
[ 8, 9]],

[[ 2, 3],
[ 6, 7],
[10, 11]]],


[[[12, 13],
[16, 17],
[20, 21]],

[[14, 15],
[18, 19],
[22, 23]]]])

In [37]: blocked.shape
Out[37]: (2, 2, 3, 2)

现在你可以 reshape 它,使一个 block 中的所有值都在最后一个轴上:
In [41]: reshaped = blocked.reshape(-1, 3*2); reshaped
Out[41]:
array([[ 0, 1, 4, 5, 8, 9],
[ 2, 3, 6, 7, 10, 11],
[12, 13, 16, 17, 20, 21],
[14, 15, 18, 19, 22, 23]])

现在您可以沿该轴求和,或取其平均值或对每个 block 的元素应用一些其他函数:
In [103]: reshaped.sum(axis=-1)
Out[103]: array([ 27, 39, 99, 111])

In [104]: reshaped.mean(axis=-1)
Out[104]: array([ 4.5, 6.5, 16.5, 18.5])

不像 my first answer ,只能应用于二维数组, blockwise_view可以应用于任意 N 维数组。它返回一个
2N 维数组,其中前 N 个轴对 block 进行索引。

关于arrays - Numpy 中的分块操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34325176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com