2015-04-25 2 views
6

Я работаю над проектом, где мне нужно иметь дело с 3-мерным большим массивом. Я использовал numpy 3d-массив, но большая часть моих записей будет равна нулю, так что много потерь памяти. Очевидно, Scipy разреженный позволяет только 2D-матрицу. Есть ли другой способ хранения 3D разреженного массива?Python многомерный разреженный массив

ответ

1

Вы правы; не похоже, что существуют установленные инструменты для работы с n-мерными разреженными массивами. Если вам просто нужно получить доступ к элементам из массива, есть варианты с использованием словаря с ключом на кортежах. См:

sparse 3d matrix/array in Python?

Если вам нужно делать операции на разреженных 3d матрицы, он получает harder- вы, возможно, придется сделать некоторые из кодирования самостоятельно.

+0

Я не хотел использовать словарь, потому что мне нужно выполнить векторную операцию над массивом. Я не знаю, скоро ли они будут со словарем? – Naman

+0

Добавьте примеры векторных операций, которые вы хотите задать. Это может предполагать, какой разреженный формат лучше всего, и можно ли его адаптировать. – hpaulj

4

scipy.sparse имеет несколько форматов, хотя только пара имеет эффективный набор числовых операций. К сожалению, это труднее продлить.

dok использует кортеж индексов в качестве словарных ключей. Так что было бы легко обобщить от 2d до 3d или более. coo имеет row, col, data атрибут массивов. Концептуально то, добавив третий depth (?), Легко. lil, вероятно, потребуются списки в списках, которые могут стать беспорядочными.

Но csr и csc магазин массив в indices, indptr и data массивов. Этот формат был разработан много лет назад математиками, работающими с проблемами линейной алгебры, а также эффективными математическими операциями (умножение матриц esp). (Соответствующая статья цитируется в исходном коде).

Так что представление трехмерных разреженных массивов не является проблемой, но для реализации эффективных векторных операций может потребоваться фундаментальное математическое исследование.

Вам действительно нужен 3D-макет для выполнения векторных операций? Могли бы вы, например, изменить 2 размера на 1, по крайней мере временно?

Операции элементов по элементам (*, +, -) работают точно так же, как с данными сплющенного массива, как с 2 или 3-й версией. np.tensordot обрабатывает умножение матрицы nD путем преобразования входов в 2D-массивы и применения np.dot. Даже когда np.einsum используется на 3D-массивах, суммирование продукта обычно выполняется только по одной паре измерений (например, «ijk, jl-> ikl»)

3D-представление может быть концептуально удобным, но я не могу придумать математическая операция, которая требует его (вместо 2 или 1d).

В целом я думаю, что вы получите больше скорости от перестройки своих массивов, чем от поиска/реализации реальных трехмерных разреженных операций.

Смежные вопросы