Одна из идей заключалась бы в том, чтобы уменьшить использование с использованием разреженных операций.
data = data.tocsc() # sparse operations are more efficient on csc
N, M = data.shape
s, t = 400, 400 # decimation factors for y and x directions
T = sparse.csc_matrix((np.ones((M,)), np.arange(M), np.r_[np.arange(0, M, t), M]), (M, (M-1) // t + 1))
S = sparse.csr_matrix((np.ones((N,)), np.arange(N), np.r_[np.arange(0, N, s), N]), ((N-1) // s + 1, N))
result = S @ data @ T # downsample by binning into s x t rectangles
result = result.todense() # ready for plotting
Этот фрагмент кода реализует простой биннинга, но может быть уточнена, чтобы включить более сложные фильтры. Матрицы биннинга представляют собой только двоичные матрицы id, например S_ij = 1, если j // s = i еще 0.
Еще несколько объяснений. Поскольку исходная матрица очень велика, есть возможность уменьшить ее, без какой-либо визуально заметной разницы в выходе.
Вопрос в том, как уменьшить размер без предварительного создания плотного представления. Один из возможных ответов - выразить биннинг в терминах матричного умножения, а затем использовать разреженное матричное умножение.
Так что, если умножив исходные данные справа с матрицей биннинга T
затем столбцы T
соответствуют закромам столбцов, в частности, число столбцов T
определяют, сколько пикселей пониженной дискретизации данных будут иметь в x направление. Каждый столбец T
определяет, что входит в соответствующий ящик, а что нет. В примере я установил ряд элементов, которые кодируют соседние столбцы (исходной матрицы) в 1, а остальные - в 0. Это заставляет эти столбцы суммировать их и помещает сумму в матрицу результатов, другими словами, она объединяет эти столбцы вместе ,
Умножение налево работает точно так же, только оно влияет на строки, а не на столбцы.
Если вы считаете, что биннинг слишком груб, вы можете заменить простую нулевую схему, например, гладким ядром, просто убедитесь, что результирующая матрица остается разреженной. Для создания такой матрицы требуется немного больше усилий, но это не сложно. Вы используете разреженную матрицу для своих данных, поэтому я предполагаю, что вы знакомы с тем, как построить разреженную матрицу.
Никогда не пробовал самостоятельно, но вы заглянули в 'datashader'. Может быть полезно. – reptilicus
Вы считали, что просто очерчиваете точки отдельно, как коллекцию разброса или прямоугольника? – ImportanceOfBeingErnest
Обычно я это делаю, но в этом случае каждая ячейка содержит счетчик, поэтому мне не важно, заполняется ли ячейка, но о том, какое значение она имеет. Я не уверен, как бы я визуализировал это, используя разброс. Я еще не смотрел на 'datashader', но посмотрю. –