Python 如何使用n个元素的和来减少numpy数组的维数?
我有以下数组(数字是用于说明的占位符): 我想以一种方式减少维度,每9个元素(3x3区域)具有相同的数字,在这里将被求和。所以12*12阵列应该变成4x4阵列 我在这里寻找其他答案,并为我改编的一维阵列找到了一些东西。 无论如何,它没有按预期工作:Python 如何使用n个元素的和来减少numpy数组的维数?,python,arrays,numpy,Python,Arrays,Numpy,我有以下数组(数字是用于说明的占位符): 我想以一种方式减少维度,每9个元素(3x3区域)具有相同的数字,在这里将被求和。所以12*12阵列应该变成4x4阵列 我在这里寻找其他答案,并为我改编的一维阵列找到了一些东西。 无论如何,它没有按预期工作: result = np.sum(arr.reshape(-1,3), axis=1) result = np.sum(result .reshape(3,-1), axis=0) 正确的做法是达到预期的结果吗?我建议如下,因为对于这种特殊情况,它更
result = np.sum(arr.reshape(-1,3), axis=1)
result = np.sum(result .reshape(3,-1), axis=0)
正确的做法是达到预期的结果吗?我建议如下,因为对于这种特殊情况,它更简单、更有效,尽管我下面的建议更一般,如果您想要的不仅仅是一个总数
你在找我。在数组上运行一个小内核,执行元素乘法并对结果求和,在每一步为新数组生成值。在本例中,我们需要一个简单的求和,因此我们将使用一个大小合适(3x3)的核。因为我们不希望重叠,所以我们在两个方向上的步幅也是3 二维卷积在NumPy中不可用,因此我们必须从SciPy导入。但该函数没有跨步(跳过)功能,因此我们将手动实现自己的功能
来自scipy.signal import convolve2d
内核=np.ones((3,3))
convolved=convolve2d(arr,内核,mode='valid')
步幅=卷积的[::3,::3]
stridded
在这里包含结果,我们可以通过除以9来检查最终结果,以获得每个单元格的原始值
>>跨步/9
数组([[1,2,3,4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]])
我们可以使用浏览
对阵列进行快速查看,然后获取每个块的总和:
from skimage.util.shape import view_as_blocks
n = 3
view_as_blocks(arr, (n,n)).sum((-1,2))
array([[ 9, 18, 27, 36],
[ 45, 54, 63, 72],
[ 81, 90, 99, 108],
[117, 126, 135, 144]])
如果我们看扁平阵列
arr.ravel()
# array([ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 2, 2,
# 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4,
# 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 5, 5, 5,
# 6, 6, 6, 7, 7, 7, 8, 8, 8, 5, 5, 5, 6, 6, 6, 7, 7,
# 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 9,
# 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 9, 9, 9, 10, 10, 10,
# 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16,
# 16, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 13, 13, 13, 14,
# 14, 14, 15, 15, 15, 16, 16, 16])
我们可以看到一种模式
3个
数字组4
3的超级组中
arr.reformate(-1,3,4,3).sum(-1,3))
#数组([[9,18,27,36],
# [ 45, 54, 63, 72],
# [ 81, 90, 99, 108],
# [117, 126, 135, 144]])
在稍微调整了一下重塑
之后,我想到了这个
arr=np.数组([[1,1,1,2,2,3,3,4,4,4],
[ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
[ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
[ 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8],
[ 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8],
[ 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8],
[ 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12],
[ 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12],
[ 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12]])
a=np.size(arr,0)//3
b=np.大小(arr,1)//3
np.和(arr.重塑(a,3,b,3),轴=(1,3))
#结果
数组([[9,18,27,36],
[ 45, 54, 63, 72],
[ 81, 90, 99, 108]])
每个“正方形”是否都有唯一的值,如示例中所示?由@MykolaZotko链接的问题包含部分答案,但对于这种情况,我认为我们需要跨越,如我下面的答案所示。该问题询问的是其他问题。就如何解决它们而言,它们是相互联系的,但它们问的问题不同@MykolaZotkoWhy除以n**2
?如果您想要平均值,只需使用.mean()
。但是OP想要求和,所以不需要标准化。你也可以做.sum(-1,-2)
True,假设mean
出于某种原因,更新了@nils thxI,你认为你需要一个元组来连接轴,沿着它来减少@nilsMaybe,4可以在知道块大小的情况下得到吗<代码>arr.shape[0]//3?
arr.ravel()
# array([ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 2, 2,
# 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4,
# 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 5, 5, 5,
# 6, 6, 6, 7, 7, 7, 8, 8, 8, 5, 5, 5, 6, 6, 6, 7, 7,
# 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 9,
# 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 9, 9, 9, 10, 10, 10,
# 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16,
# 16, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 13, 13, 13, 14,
# 14, 14, 15, 15, 15, 16, 16, 16])