Как повернуть массив индексов в NumPy? - PullRequest
1 голос
/ 08 марта 2019

У меня есть сетка, представляющая собой массив с цифрами формы (522, 476).

Затем у меня есть еще один массив с фигурами, который представляет собой траекторию отдельных точек xy (индексов сетки) формы (2, 3866).

Я успешно поворачиваю сетку, используя np.rot90(grid).Мой вопрос заключается в том, как мне вращать траекторию таким же образом, чтобы отдельные точки xy продолжали выравниваться по сетке.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Если вы всегда хотите повернуть на 90 градусов только один раз и всегда в одном и том же направлении (поэтому rot90 без каких-либо других аргументов), вы можете использовать эту формулу:

idx2 = np.array([[n.shape[0]-1-x[1], x[0]] for x in idx])

Предполагая, что idx - ваши индексымассив и n это повернутый массив.Он просто использует знания о том, что делает единое вращение с элементами, то есть переключает первое измерение на второе и делает второе измерение отсчитанным от конца до первого измерения.

1 голос
/ 08 марта 2019

Вы можете определить функцию поворота:

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)

Наилучшее

...