Вопрос или проблема
Я заполняю массив numpy нулями или единицами в зависимости от того, больше или меньше ли вычисленное значение по индексу данного массива. В результате получается массив из нулей и единиц. Matplotlib так не считает.
Сравнение вычисляется как d=sin(bpi/180)x+sin(api/180)cos(bpi180)*y
Уникальное выражение выводит “уникальные значения в пространстве [0. 1.]”.
Последнее изображение показывает тот же код с массивом True/False вместо 0/1.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
tan=np.tan
sin=np.sin
cos=np.cos
pi=np.pi
x=4
y=3
Max=.3
sizeOfSpace=2000
alpha=np.linspace(-10, 10,sizeOfSpace)
beta=np.linspace(-10, 10,sizeOfSpace)
space=np.zeros((sizeOfSpace,sizeOfSpace))
for i,a in enumerate(alpha):
for j,b in enumerate(beta):
d=sin(b*pi/180)*x+sin(a*pi/180)*cos(b*pi*180)*y
space[i,j]=int(0) if d<Max else int(1)
plt.imshow(space,cmap=plt.cm.gray)
plt.colorbar()
print(f'уникальные значения в пространстве {np.unique(space)}')
Есть ли какие-либо предложения, как создать бинарное изображение?
import numpy as np
import matplotlib.pyplot as plt
array = np.random.rand(100, 100) > 0.5
plt.imshow(array, cmap=’gray’)
plt.show()
- Элемент списка
Ответ или решение
Ваша проблема с отображением бинарного изображения в Matplotlib может быть связана с неправильной логикой в расчетах, а также с неправильным представлением логических значений при отрисовке. Давайте подробно рассмотрим ваш код и предложим необходимые изменения для получения корректного бинарного изображения.
Ваша текущая логика:
Вы используете следующую логику для заполнения массива space
:
for i, a in enumerate(alpha):
for j, b in enumerate(beta):
d = sin(b * pi / 180) * x + sin(a * pi / 180) * cos(b * pi / 180) * y
space[i, j] = int(0) if d < Max else int(1)
Проблемы:
- Ваша формула использования
cos(b * pi * 180)
должна быть с180
в знаменателе (может быть опечатка). - Вы используете
int(0)
иint(1)
для заполнения массива, что допустимо, но это может привести к путанице при визуализации, если не правильно настроен цветовой масштаб. - При использовании
plt.imshow()
можно использовать значенияTrue
иFalse
, и тогда Matplotlib правильно интерпретирует эти значения как 1 и 0 при отображении.
Исправленный код:
Вот исправленный и улучшенный код с учетом вышеупомянутых замечаний:
import numpy as np
import matplotlib.pyplot as plt
tan = np.tan
sin = np.sin
cos = np.cos
pi = np.pi
x = 4
y = 3
Max = 0.3
sizeOfSpace = 2000
alpha = np.linspace(-10, 10, sizeOfSpace)
beta = np.linspace(-10, 10, sizeOfSpace)
space = np.zeros((sizeOfSpace, sizeOfSpace), dtype=np.bool_)
for i, a in enumerate(alpha):
for j, b in enumerate(beta):
d = sin(b * pi / 180) * x + sin(a * pi / 180) * cos(b * pi / 180) * y
space[i, j] = d >= Max # Используем логическое выражение
plt.imshow(space, cmap=plt.cm.gray)
plt.colorbar()
print(f'Уникальные значения в пространстве: {np.unique(space)}')
plt.show()
Объяснения изменений:
-
Исправление углов:
cos(b * pi / 180)
вместоcos(b * pi * 180)
. Это важно, чтобы не получать неправильные значения из-за неверной единицы измерения. -
Максимальное значение: Использование
d >= Max
для заполнения массива логическими значениями (True/False) помогает Matplotlib правильно интерпретировать массив для визуализации. -
Тип данных: Установка
dtype=np.bool_
для массиваspace
позволит вас напрямую работать с логическими значениями.
Визуализация:
Используя plt.imshow
, вы сможете получить бинарное изображение только с черным и белым цветом, где черный представляет 0, а белый 1.
Таким образом, данная версия кода должна корректно отображать бинарное изображение в зависимости от ваших расчетов, устраняя проблемы, которые были у вас ранее. Если у вас будут дополнительные вопросы, не стесняйтесь спрашивать!