Я есть задача, в которой я выполняю операцию преобразования, и поэтому мне нужно «пересопоставить» данные из одного массива в новый массив, но то, где данные окажутся в новом массиве, зависит от результата вычисления.
Предположим, сейчас я рассматриваю 3 массива numpy:
A (имеет исходные данные), B (переназначение точек, нет данных), C (результирующий массив).
Есть ли какой-нибудь способ выполнить эту операцию «быстро»?
Я имею в виду, что знаю, писал ли я это на «C». это, вероятно, даже не будет вопросом, поскольку в любом случае он работает достаточно быстро. И если бы мне действительно нужна была скорость, я, вероятно, мог бы соединить B и C из A с помощью уравнения для прямой передачи из местоположений указателя прямо из памяти.
Я пока не собираюсь усложнять ситуацию. Но мне интересно, есть ли быстрый и эффективный способ сделать это в Python.
Вот пример: допустим, я выполняю поворот изображения с тройным сдвигом. «A» в данном случае — это мое исходное изображение формы (x, y, 3) (очевидно, 3 — это значения RGB), «B» — это мое «преобразование» того места, где теперь должны оказаться старые пиксели из «A». А затем «C» — это когда мне действительно нужно все переместить (т. е. x, y 3, переместить все данные в третьем измерении в новое место).
Как уже упоминалось, с циклом for это не так уж сложно, но циклы for в Python работают очень медленно.
Код: Выделить всё
import numpy as np
import math as m
# Define theta in degrees
angle = 30
theta = m.radians(angle)
# Triple shear transformation
# first = np.array([[1, -np.tan(theta/2)], [0, 1]])
# second = np.array([[1, 0], [np.sin(theta), 1]])
# third = np.array([[1, -np.tan(theta/2)], [0, 1]])
side = np.array([[1, -np.tan(theta/2)], [0, 1]])
middle = np.array([[1, 0], [np.sin(theta), 1]])
# Define vector test set - X, Y
pixels = np.array([[10, 5], [20, 3], [4, 5]])
# Perform the matrix multiplication
# result = first @ second @ third @ pixels.T
result = side @ middle @ side @ pixels.T
# Print the result
print(np.round(result.T))
Есть ли прямой способ указать Python отправлять данные из исходных местоположений (
Код: Выделить всё
[[10, 5], [20, 3], [4, 5]]
т.е. «нравится» команде копирования, но я представляю ее только со списком «что и куда должно идти»? Возможно, мне удастся сделать то, что я хотел, с помощью np.roll()?
Подробнее здесь: https://stackoverflow.com/questions/781 ... orized-way