Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用n个元素的和来减少numpy数组的维数?_Python_Arrays_Numpy - Fatal编程技术网

Python 如何使用n个元素的和来减少numpy数组的维数?

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) 正确的做法是达到预期的结果吗?我建议如下,因为对于这种特殊情况,它更

我有以下数组(数字是用于说明的占位符):

我想以一种方式减少维度,每9个元素(3x3区域)具有相同的数字,在这里将被求和。所以12*12阵列应该变成4x4阵列

我在这里寻找其他答案,并为我改编的一维阵列找到了一些东西。 无论如何,它没有按预期工作:

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])