使用NumPy创建一个数组,它是给定大小的每个连续子数组的平均值

  • Post category:Python

首先需要导入NumPy库。

import numpy as np

创建一个数组,输入每个连续子数组的值。

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

现在我们可以根据需要定义每个连续子数组的大小,这里定义了大小为 2×2:

window_size = (2, 2)

现在我们将创建一个展平版本的数组,以便我们可以计算指定大小的每个连续子数组的平均值。

shape = (arr.shape[0] - window_size[0] + 1, arr.shape[1] - window_size[1] + 1) + window_size
strides = (arr.strides[0], arr.strides[1]) + arr.strides
a = np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)

这个a数组就是我们要找的每个连续子数组的展平版本了。现在我们计算每个这样的数组的平均值:

result = a.mean(axis=(2,3))

完整的代码如下所示:

import numpy as np

# 创建数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 定义连续子数组大小
window_size = (2, 2)

# 创建展平版本数组
shape = (arr.shape[0] - window_size[0] + 1, arr.shape[1] - window_size[1] + 1) + window_size
strides = (arr.strides[0], arr.strides[1]) + arr.strides
a = np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)

# 计算每个数组的平均值
result = a.mean(axis=(2,3))

# 输出结果
print(result)

输出结果为

[[ 3.5  4.5  5.5]
 [ 7.5  8.5  9.5]]

这里我们输入的数组是一个 3×4 的数组,使用大小为 2×2 的连续子数组。输出结果是一个 2×3 的数组,其中每个元素是它对应的连续子数组的平均值。