Я работаю над проектом, где мне нужно иметь дело с 3-мерным большим массивом. Я использовал numpy 3d-массив, но большая часть моих записей будет равна нулю, так что много потерь памяти. Очевидно, Scipy разреженный позволяет только 2D-матрицу. Есть ли другой способ хранения 3D разреженного массива?Python многомерный разреженный массив
ответ
Вы правы; не похоже, что существуют установленные инструменты для работы с n-мерными разреженными массивами. Если вам просто нужно получить доступ к элементам из массива, есть варианты с использованием словаря с ключом на кортежах. См:
sparse 3d matrix/array in Python?
Если вам нужно делать операции на разреженных 3d матрицы, он получает harder- вы, возможно, придется сделать некоторые из кодирования самостоятельно.
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).
В целом я думаю, что вы получите больше скорости от перестройки своих массивов, чем от поиска/реализации реальных трехмерных разреженных операций.
- 1. Многомерный массив Python
- 2. Многомерный массив Python/Django
- 3. Python: заполнить многомерный массив
- 4. Многомерный массив в Python
- 5. Заполните разреженный массив
- 6. Инициализировать разреженный статический массив
- 7. Bash инициализировать разреженный массив
- 8. Итерационный многомерный массив в Python
- 9. POSTing многомерный массив из Python
- 10. Сохраните разреженный массив в csv
- 11. Объявить разреженный массив в CoffeeScript
- 12. Срезать массив и получить только разреженный массив
- 13. Поделиться SciPy разреженный массив между объектами процесса
- 14. проверки многомерный массив существует другой многомерный массив
- 15. Многомерный массив указателей на многомерный массив
- 16. PHP массив многомерный Питону многомерный ДИКТ
- 17. Быстрый n-мерный разреженный массив в Python/Cython
- 18. mmap разреженный вектор в python
- 19. Python: изменить разреженный элемент массива
- 20. Многомерный массив - массив массивов?
- 21. Многомерный массив
- 22. Многомерный массив
- 23. многомерный массив
- 24. многомерный массив
- 25. многомерный массив
- 26. Многомерный массив
- 27. многомерный массив
- 28. многомерный массив
- 29. Многомерный массив
- 30. Многомерный массив
Я не хотел использовать словарь, потому что мне нужно выполнить векторную операцию над массивом. Я не знаю, скоро ли они будут со словарем? – Naman
Добавьте примеры векторных операций, которые вы хотите задать. Это может предполагать, какой разреженный формат лучше всего, и можно ли его адаптировать. – hpaulj