Как изменить элементы 2D-массива в Numpy? - PullRequest
1 голос
/ 07 октября 2019

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

import numpy as np

x = np.linspace(0,1000, 1000/50)
y = np.linspace(0,1000, 1000/50)
X,Y = np.meshgrid(x,y)

source =  np.column_stack([X.ravel(), Y.ravel()]).astype(int)
destination = source.copy()

for x, i in np.ndenumerate(source):
    # if smth:
    destination[i] = np.array([x[0] + 10, x[1]])

Я думаю, что я не должен использовать исходный массив, а только выполнять итерации по целевому массиву (не может быть сделано с использованием стандартных методов),скажите мне правильное решение, спасибо заранее.

Current output:
[421 789]
[473 789]
[526 789]
[578 789]
[631 789]
[684 789]


Required output:
[431 789]
[483 789]
[536 789]
[588 789]
[641 789]
[694 789]

Я объясню более просто, у меня есть сетка, у нее есть точки, мне нужно сместить точки, скажем, 88, 89, 90, 10пикселей вправо, для этого мне нужно иметь массив источника и места назначения (где эти точки смещены), перечислить, скорее всего, это мне не подходит, но обычное редактирование массива, как для x в пункте назначения: при редактированииx дает желаемый результат, но это не относится к ndarray

enter image description here

for x, i in enumerate(destination):
     inside = cv2.pointPolygonTest(cnt, (destination[x,0], 
     destination[x,1]), False)
   if inside > 0:
    cv2.circle(img, (destination[x,0], destination[x,1]), 10, 
  (255,0,0), 2)
    destination[x] = np.array([destination[x,0] + 10, destination[x,1]])

 # Contour(cnt)
 [[550  42]
 [600  42]
 [690 273]
 [640 273]]

Как вы понимаете, мне нужно сдвинуть все, что обведено всиний на 10 пикселей

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Решение

От создания данных до модификации целевого региона мы можем разделить его на три этапа. Модификация может быть достигнута с использованием индексации numpy вместе с условным выбором области с помощью numpy.where и numpy.logical_and (при необходимости).

1. Сделать данные

import numpy as np

x = np.linspace(0,1000, int(1000/50))
y = np.linspace(0,1000, int(1000/50))
X,Y = np.meshgrid(x,y)

source =  np.column_stack([X.ravel(), Y.ravel()]).astype(int)
destination = source.copy()

2. Используйте условное выражение для нахождения целевой области

target_index = np.where(np.logical_and(destination[:,1]==789, destination[:,0]>=421))
destination[target_index]

Вывод :

array([[ 421,  789],
       [ 473,  789],
       [ 526,  789],
       [ 578,  789],
       [ 631,  789],
       [ 684,  789],
       [ 736,  789],
       [ 789,  789],
       [ 842,  789],
       [ 894,  789],
       [ 947,  789],
       [1000,  789]])

3. Внесите изменения в целевой регион

scope = destination[target_index] 
scope[:,0] = scope[:,0] + 10
destination[target_index] = scope
destination[target_index]

Вывод :

array([[ 431,  789],
       [ 483,  789],
       [ 536,  789],
       [ 588,  789],
       [ 641,  789],
       [ 694,  789],
       [ 746,  789],
       [ 799,  789],
       [ 852,  789],
       [ 904,  789],
       [ 957,  789],
       [1010,  789]])
1 голос
/ 07 октября 2019

То, что вы спрашиваете, не совсем понятно. Как вы хотите изменить destination?

Кроме того, вы уверены, что вам нужно np.ndenumerate, а не enumerate?

Вот способ изменить его на основезначения в sources. В позиции (индекс) x пункт назначения станет равным элементу x первого столбца source + 10 и равен элементу x второго столбца source.

for index, value in enumerate(source):
    destination[index] = [source[index,0]+10, source[index,1]] # x+10, y same
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...