У меня есть 200 x 200 np.ndarry
промежуточных звеньев (называемых a
), значения которых находятся в диапазоне от 0 до 100 (присутствуют все значения). Затем у меня есть np.array
длины 100 (называемый b
), который содержит реальные значения.
Чтобы придать смысл проблеме, массивы a
и b
происходят из проблемы сегментации ML , Матрица a
показывает сегментацию, где 0 представляет фон, а 1-100 представляет различные экземпляры. Затем каждому экземпляру соответствует реальное значение (интенсивность), и эти интенсивности сохраняются в векторе b
. Вот почему вектор b
имеет только 100 записей (а не 101), потому что фон не имеет интенсивности.
Теперь вернемся к исходной проблеме. Я хотел бы эффективно построить изображение 200 x 200, в котором пиксели, соответствующие значению a
, равному 0, отображаются цветом RGBA (0, 0, 0, 0), то есть прозрачным, в то время как пиксель в a
имеет значение v
, с v
между 1 и 100 (включая крайние значения), тогда я хотел бы изобразить эту интенсивность, используя непрерывную карту цветов.
Код, который я написал, работает, но он очень медленный ( это занимает 8 секунд, и с большими изображениями это боль). Как я могу написать это более эффективно?
import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
import matplotlib.colors
import matplotlib.cm
# generating fake data
masks = np.random.randint(0, 100, (200, 200))
# to make sure that all the values are present at least once
masks[0, 0:101] = list(range(101))
feature = np.random.rand(100)
# plotting the data
norm = matplotlib.colors.Normalize(vmin=feature.min(), vmax=feature.max(), clip=True)
mapper = matplotlib.cm.ScalarMappable(norm=norm, cmap=plt.get_cmap('viridis'))
image = np.zeros((masks.shape[0], masks.shape[1], 4), dtype=np.float)
for i in tqdm(range(masks.shape[0])):
for j in range(masks.shape[1]):
value = masks[i, j]
if value > 0:
feature_value = feature[value - 1]
image[i, j, :] = mapper.to_rgba(feature_value)
else:
image[i, j, :] = (0, 0, 0, 0)
plt.figure(figsize=(16, 9))
plt.imshow(image)
plt.show()