Numpy многомерный массив массива неизвестная логическая ошибка - PullRequest
1 голос
/ 08 мая 2019

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

тип данных

...

[[1128 1026 1192 1023]]

[[ 771  195  858  196]]

[[ 953 1799  955 1738]]]

когда у меня есть массив int, этот же алгоритм прекрасно его сортирует,

 g = [i for i in range(10)]

for i in range(0,len(g)):
    for j in range(0,len(g)):
        if(g[i]>g[j]):
            cnt = g[i]
            g[i] = g[j]
            g[j] = cnt

Я предполагаю, что моя проблема в том, что я не понимаю многомерное присвоение элемента numpy массива, пожалуйста, объясните, почему это ломается:

lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),

                min_line_length, max_line_gap)

сортировка по 2-му элементу каждого элемента

for i in range(0,len(lines)):

    for j in range(0,len(lines)):

        if(lines[i][0][1]<lines[j][0][1]):

            cnt = lines[i][0]

            lines[i][0] = lines[j][0]

            lines[j][0] = cnt[/CODE]

теперь массив

[[[ 738 1831  867 1831]]

...

[[ 738 1831  867 1831]]

[[ 738 1831  867 1831]]

[[ 738 1831  867 1831]]]

почему? Любая помощь приветствуется.

1 Ответ

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

Хотя вы хотите, чтобы ваш код присваивал значение переменной новому объекту, ваш код интерпретируется по-разному:

Цитата из стандартной библиотеки python :

Операторы присваивания в Python не копируют объекты, они создают привязки между целью и объектом.Для коллекций, которые являются изменяемыми или содержат изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую.Этот модуль предоставляет общие операции мелкого и глубокого копирования (объяснено ниже).

Я приведу пример со списками:

a инициализируется как список с одним элементом, который имеет значение9:

In [1]: a = [9]

Теперь

In [2]: b = a

, хотя может показаться, что вы только что создали объект с тем же значением, что и a, то, что эта строка кода делает в действительности,создать ссылку на объект same.

Итак, присвоение нового значения первому элементу a изменит базовый объект:

In [3]: a[0] = 1

И если новыйимя, которое вы дали этому объекту, называется, оно по-прежнему будет ссылаться на этот объект:

In [4]: b
Out[4]: [1]

Чтобы избежать нежелательного поведения, вы должны использовать copy:

In [1]: import copy

In [2]: a = [9]

In [3]: b = copy.copy(a)

In [4]: a[0] = 1

In [5]: b
Out[5]: [9]

np.arraysметод .copy (), который можно вызывать так, не импортируя копию:

a = np.array([1,2,3])
b = a.copy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...