Я бы интерполировал данные на регулярной сетке. Например, вы можете использовать LinearTriInterpolator .
So:
import matplotlib.tri as mtri
Затем замените вашу строку
cs = m.pcolormesh( lons, lats, data, shading='flat', latlon=True, vmin=0, vmax=100)
на что-то как
ngrid = 50
rlons = np.repeat(np.linspace(np.min(lons), np.max(lons), ngrid),
ngrid).reshape(ngrid, ngrid)
rlats = np.repeat(np.linspace(np.min(lats), np.max(lats), ngrid),
ngrid).reshape(ngrid, ngrid).T
tli = mtri.LinearTriInterpolator(mtri.Triangulation(lons.flatten(), lats.flatten()),
data.flatten())
rdata = tli(rlons, rlats)
cs = m.pcolormesh(rlons, rlats, rdata, latlon=True, vmin=0, vmax=100)
Виртуальные адреса необходимы для запуска нескольких программ на компьютере.
Предположим, что нет механизма виртуальных адресов. Компиляторы и редакторы ссылок генерируют макет памяти с заданным шаблоном. Инструкция (текстовый сегмент) размещается в памяти с адреса 0. Затем идут сегменты для инициализированных или неинициализированных данных (data и bss) и динамической памяти (куча и стек). (см., например, https://www.geeksforgeeks.org/memory-layout-of-c-program/ , если у вас нет представления о разметке памяти)
Когда вы запускаете эту программу он будет занимать часть памяти, которая больше не будет доступна другим процессам совершенно непредсказуемым образом. Например, адреса от 0 до 1M будут заняты, или от 0 до 16k, или от 0 до 128M, это полностью зависит от характеристик программы. Если теперь вы хотите одновременно запустить вторую программу, куда ее инструкции и данные попадут в память? Адреса памяти генерируются компилятором, который, очевидно, не знает во время компиляции, что будет свободной памятью. И помните, что адреса памяти (для инструкций или данных) как-то жестко запрограммированы в программном коде.
Вторая проблема возникает, когда вы хотите запустить много процессов и у вас заканчивается память. В таких ситуациях некоторые процессы выгружаются на диск и позже восстанавливаются. Но после восстановления процесс пойдет туда, где память свободна, и опять же, это что-то непредсказуемое и потребует изменения внутренних адресов программы.
Виртуальная память упрощает все эти задачи. При запуске процесса (или его восстановлении после перестановки) система просматривает свободную память и заполняет таблицы страниц, чтобы создать сопоставление между виртуальными адресами (управляемыми процессором и всегда неизменными) и физическими адресами (что зависит от свободной памяти на компьютер в данный момент).