我有两个 numpy 的 shape 数组(436, 1024, 2)。最后一个维度 ( 2) 表示 2D 向量。我想按元素比较两个 numpy 数组的二维向量,以便找到平均角度误差。
为此,我想使用点积,它在循环数组的前两个维度时工作得很好(forPython 中的循环可能很慢)。因此我想使用 numpy 函数。
我发现这np.tensordot允许按元素执行点积。但是,我没有成功地使用它的axes论点:
import numpy as np
def average_angular_error_vec(estimated_oc : np.array, target_oc : np.array):
estimated_oc = np.float64(estimated_oc)
target_oc = np.float64(target_oc)
norm1 = np.linalg.norm(estimated_oc, axis=2)
norm2 = np.linalg.norm(target_oc, axis=2)
norm1 = norm1[..., np.newaxis]
norm2 = norm2[..., np.newaxis]
unit_vector1 = np.divide(estimated_oc, norm1)
unit_vector2 = np.divide(target_oc, norm2)
dot_product = np.tensordot(unit_vector1, unit_vector2, axes=2)
angle = np.arccos(dot_product)
return np.mean(angle)
我有以下错误:
ValueError: shape-mismatch for sum
下面是我的函数,它正确计算平均角度误差:
def average_angular_error(estimated_oc : np.array, target_oc : np.array):
h, w, c = target_oc.shape
r = np.zeros((h, w), dtype="float64")
estimated_oc = np.float64(estimated_oc)
target_oc = np.float64(target_oc)
for i in range(h):
for j in range(w):
unit_vector_1 = estimated_oc[i][j] / np.linalg.norm(estimated_oc[i][j])
unit_vector_2 = target_oc[i][j] / np.linalg.norm(target_oc[i][j])
dot_product = np.dot(unit_vector_1, unit_vector_2)
angle = np.arccos(dot_product)
r[i][j] = angle
return np.mean(r)
守候你守候我
相关分类