Я портировал некоторый код MATLAB на Python, включая утилиту построения графиков, которая отображает цветовую карту некоторых данных в 2D-матрице (списке). Утилиты построения графиков MATLAB и Python очень похожи, поэтому я могу сделать их визуально достаточно близкими, с небольшими усилиями.
Я использую тестовую матрицу:
X = [ 1 0 3 ]
[ 4 5 6 ]
[ 7 8 9 ]
MATLAB с тестовой матрицей
X = [1 0 3;
4 5 6;
7 8 9];
figure(1);
imagesc(X);
colormap(hot);
colorbar;
Python с тестовой матрицей
import numpy as np
import matplotlib as plt
X = [ [1,0,3] , [4,5,6] , [7,8,9] ]
fig = []
fig.append( plt.figure(1) )
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto')
plt.colorbar()
fig[0].show()
Эта проблема возникает, когда я конвертирую в дБ (беру log10 каждого элемента и умножаю на 10), что дает мне тестовую матрицу дБ.
Y = [ 0.0000 -Inf 4.7712 ]
[ 6.0206 6.9897 7.7815 ]
[ 8.4510 9.0309 9.5424 ]
MATLAB с тестовой матрицей дБ
Y = 10*log10(X)
figure(2);
imagesc(Y);
colormap(hot);
colorbar;
Python с тестовой матрицей дБ
Y = 10*np.log10(X)
fig.append( plt.figure(2) )
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto')
plt.colorbar()
fig[1].show()
Что случилось с верхним средним элементом? Это -Inf, что следует рассматривать как низкое значение. В MATLAB он устанавливается равным наименьшему значению, которое существует в массиве, в данном случае 0. Это имеет смысл, потому что, хотя -Inf меньше 0, это разрушило бы масштабирование, если бы мы использовали его «фактическое значение».
С другой стороны, Python интерпретирует это значение -Inf как высокое значение, устанавливая его равным наивысшему значению в массиве - 9,5424. Для меня это имело бы смысл, если бы значение было просто Inf. Однако это определенно -Inf, как и должно быть. Почему здесь неточность, и могу ли я исправить это, не влияя ни на что другое?
РЕДАКТИРОВАТЬ: Очевидно, я могу заменить all -Inf на Inf, найти минимум матрицы и заменить все Inf на min. Однако я работаю с большими наборами данных, поэтому делать это и сохранять исходные данные нетронутыми не очень эффективно. В идеале должен быть способ изменить способ интерпретации бесконечных значений средством построения графиков.