Объедините двумерные массивы с произвольной разделительной линией - PullRequest
1 голос
/ 14 мая 2019

У меня есть два двумерных массива NumPy одинаковой формы:

>>> a.shape
(100, 100)
>>> b.shape
(100, 100)

Я использую их в генетическом алгоритме и хотел бы реализовать кроссовер . Моя мысль - выбрать случайную разделительную линию, взяв a с одной стороны и b с другой.

Линия будет проходить через pt и pt + delta:

pt = np.random.uniform(a.shape)
angle = np.random.uniform(0, math.pi)
delta = np.array([math.cos(angle), math.sin(angle)])

Как мне создать новый массив, равный a над этой строкой и равный b под ней? Жесткая разделительная линия - это хорошо, но для бонусных точек идеальным будет сочетание двух для пикселей на линии.

1 Ответ

1 голос
/ 14 мая 2019

Я делюсь идеей с массивами помощников, используя простую линейную функцию:

# helper arrays for coordinate system
x = np.ones((100,100))
x[:,:] = np.arange(100)

y = np.ones((100,100))
y[:,:] = 100-np.arange(100).reshape(100,1) # 100- to invert y-axis

# linear function
def linfunc(x, m, n):
    return x*m + n

Идея состоит в том, чтобы вызвать линейное преобразование для координат x, а затем проверить, где результат равендо, меньше или больше, чем y координаты.Затем результат этого утверждения можно использовать для индексации входных изображений.

#test data:
a = np.ones((100,100))
b = np.zeros((100,100)) + 2
ab_mean = (a+b)/2

Контрольные примеры:

test_line = linfunc(x, 1, 0) #  y = x 
output = np.zeros_like(a)
output[y>test_line] = a[y>test_line] # assign above line to a
output[y<test_line] = b[y<test_line] # assign below line to b
output[y==test_line] = ab_mean[y==test_line] # assign coords on line to "interpolation"
plt.imshow(output)

enter image description here

test_line = linfunc(x, 1, 10) #  y = x + 10
output = np.zeros_like(a)
output[y>test_line] = a[y>test_line] # assign above line to a
output[y<test_line] = b[y<test_line] # assign below line to b
output[y==test_line] = ab_mean[y==test_line] # assign coords on line to "interpolation"
plt.imshow(output)

enter image description here

test_line = linfunc(x, -4, + 150) #  y = -4x + 150
output = np.zeros_like(a)
output[y>test_line] = a[y>test_line] # assign above line to a
output[y<test_line] = b[y<test_line] # assign below line to b
output[y==test_line] = ab_mean[y==test_line] # assign coords on line to "interpolation"
plt.imshow(output)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...