@Timebird

Как обойти двумерный массив, попутно заменяя в нём элементы?

Имеется матрица 800*600, нужно пройти по ней циклом и применить к каждому элементу этой матрицы преобразование формулой.
Допустим, циклом я прошелся:
for row in img:
	for x in row:
		x = (x - min_br) * (255 / (max_br - min_br))   # на новый х не заменяется

А вот применить преобразование не получается. То есть для того чтобы каждый элемент x заменялся на тот, что в формуле, нужно проделывать дополнительные операции:
img_contrast = np.empty(0)
for row in img:
	for x in row:
		x = (x - min_br) * (255 / (max_br - min_br))
		img_contrast = np.append(img_contrast, x)
img_contrast = np.reshape(img_contrast, (800, 600))

Все эти reshape требуют дополнительного времени, и вроде всё работает, но гораздо медленнее, чем хотелось бы. Так как можно пройтись циклом по двумерному массиву, применяя формулку к каждому элементу?
  • Вопрос задан
  • 934 просмотра
Решения вопроса 2
adugin
@adugin Куратор тега Python
Вы серьёзно? Цикл по массиву в numpy?! Зачем???
img_contrast = (img - min_br) * (255 / (max_br - min_br))
Ответ написан
Комментировать
DarkWizardUa
@DarkWizardUa
Математик, кодер
img = [[(x - min_br) * (255 / (max_br - min_br)) for x in row] for row in img]
Как-то так
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@artem78
for row in img:
  for x in row:
    img[row][x] = 'новое значение'
Ответ написан
RabraBabr
@RabraBabr
Как вам выше уже написали у вас ошибка в коде вы результат вычислений присваиваете х, в то время как х это итератор в цикле. Вам результат надо присваивать элементам матрицы.

Все это работает медленно потому, что вы не знаете как работает процессор. У вас 800х600= 480000 умножений и делений. А процессор внезапно не делить не умножать не умеет. Раскройте скобки и избавтесь от них в циклах. Все залетает.

И да как выше же написали в numpy циклы в массивах? Все уже придумано до нас.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы