如何在 numpy 中旋转索引数组?
How to rotate an array of indices in numpy?
我有一个网格,它是一个形状为 (522, 476)
.
的 numpy 数组
然后我有另一个 numpy 数组,它是形状为 (2, 3866)
.
的单个 xy 点(网格的索引)的轨迹
我使用 np.rot90(grid)
成功旋转了网格。我的问题是如何以相同的方式旋转轨迹,使各个 xy 点继续与网格对齐。
您可以定义一个旋转函数:
def rotate(origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given origin.
The angle should be given in radians.
"""
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
然后将此函数应用于轨迹的所有 (X,Y) 点。
origin = tuple(0, 0)
newTrajectory = []
for i in range(0:len(trajectory[0])):
p = tuple(trajectory[i][0], trajectory[i][1])
newP = rotate(origin, p, math.pi/2)
row = [newP[0], newP[1]]
newTrajectory.append(row)
最佳
如果您总是想旋转 90 度一次并且始终保持同一方向(因此 rot90
没有任何其他参数)您可以使用此公式:
idx2 = np.array([[n.shape[0]-1-x[1], x[0]] for x in idx])
假设 idx
是您的索引数组 (2, 3866),n
是您要索引的网格 (522, 476)。它只是使用单次旋转对元素的作用的知识,即将第一个维度切换到第二个维度,并使第二个维度从第一个维度的末尾算起。
我有一个网格,它是一个形状为 (522, 476)
.
然后我有另一个 numpy 数组,它是形状为 (2, 3866)
.
我使用 np.rot90(grid)
成功旋转了网格。我的问题是如何以相同的方式旋转轨迹,使各个 xy 点继续与网格对齐。
您可以定义一个旋转函数:
def rotate(origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given origin.
The angle should be given in radians.
"""
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
然后将此函数应用于轨迹的所有 (X,Y) 点。
origin = tuple(0, 0)
newTrajectory = []
for i in range(0:len(trajectory[0])):
p = tuple(trajectory[i][0], trajectory[i][1])
newP = rotate(origin, p, math.pi/2)
row = [newP[0], newP[1]]
newTrajectory.append(row)
最佳
如果您总是想旋转 90 度一次并且始终保持同一方向(因此 rot90
没有任何其他参数)您可以使用此公式:
idx2 = np.array([[n.shape[0]-1-x[1], x[0]] for x in idx])
假设 idx
是您的索引数组 (2, 3866),n
是您要索引的网格 (522, 476)。它只是使用单次旋转对元素的作用的知识,即将第一个维度切换到第二个维度,并使第二个维度从第一个维度的末尾算起。