代码之家  ›  专栏  ›  技术社区  ›  proximacentauri

numpy计算渐变交叉矩阵

  •  0
  • proximacentauri  · 技术社区  · 7 年前

    我使用以下方法计算多个矩阵中相同索引中数据之间的运行梯度:

    import numpy as np
    
    array_1 = np.array([[1,2,3], [4,5,6]])
    array_2 = np.array([[2,3,4], [5,6,7]])
    array_3 = np.array([[1,8,9], [9,6,7]])
    
    flat_1 = array_1.flatten()
    flat_2 = array_2.flatten()
    flat_3 = array_3.flatten()
    print('flat_1: {0}'.format(flat_1))
    print('flat_2: {0}'.format(flat_2))
    print('flat_3: {0}'.format(flat_3))
    data = []
    gradient_list = []
    for item in zip(flat_1,flat_2,flat_3):
        data.append(list(item))
        print('items: {0}'.format(list(item)))
        grads = np.gradient(list(item))
        print('grads: {0}'.format(grads))
        gradient_list.append(grads)
    
    grad_array=np.array(gradient_list)
    print('grad_array: {0}'.format(grad_array))
    

    这看起来不像是一种最佳的方法——是否有一种矢量化的方法来计算二维数组中数据之间的梯度?

    1 回复  |  直到 7 年前
        1
  •  1
  •   akuiper    7 年前

    numpy.gradient axis 作为参数,所以您可以将数组堆叠起来,然后沿着某个轴计算渐变;例如,使用 np.dstack 具有 axis=2 ;如果结果需要不同的形状,只需使用 reshape 方法:

    np.gradient(np.dstack((array_1, array_2, array_3)), axis=2)
    
    #array([[[ 1. ,  0. , -1. ],
    #        [ 1. ,  3. ,  5. ],
    #        [ 1. ,  3. ,  5. ]],
    #       [[ 1. ,  2.5,  4. ],
    #        [ 1. ,  0.5,  0. ],
    #        [ 1. ,  0.5,  0. ]]])
    

    或者先展平阵列:

    np.gradient(np.column_stack((array_1.ravel(), array_2.ravel(), array_3.ravel())), axis=1)
    
    #array([[ 1. ,  0. , -1. ],
    #       [ 1. ,  3. ,  5. ],
    #       [ 1. ,  3. ,  5. ],
    #       [ 1. ,  2.5,  4. ],
    #       [ 1. ,  0.5,  0. ],
    #       [ 1. ,  0.5,  0. ]])