Numpy计算跨矩阵的梯度

时间:2018-06-17 04:07:06

标签: python numpy

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

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 个答案:

答案 0 :(得分:1)

numpy.gradientaxis作为参数,因此您可能只是堆叠数组,然后沿某个轴计算渐变;例如,将np.dstackaxis=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. ]])