#python #arrays #numpy #fortran #f2py
#python #массивы #numpy #fortran #f2py
Вопрос:
В настоящее время у меня есть 6-мерный массив numpy в Python, где первые 4 индекса указывают, какая 2D-матрица требуется. Я могу передать это в Fortran90 с помощью f2py, а затем получить доступ к 2D-матрицам с помощью:
subroutine mySubroutine(myArray)
real(8), dimension(:,:,:,:,:,:) :: myArray
matrix = myArray(a,b,c,d,:,:)
Однако матрицы, как правило, могут быть разных размеров. Единственный метод, который я нашел, который позволяет это сделать, — сделать последние два измерения равными максимально возможному размеру, сохранить меньшие матрицы в верхнем левом углу и получить меньшую матрицу с помощью:
matrix = myArray(a,b,c,d,1:matrixSize,1:matrixSize)
Проблема в том, что это очень неэффективно с точки зрения памяти, поскольку я храню огромные пустые разделы массива, которые никогда не используются. В Python я могу решить эту проблему, составляя списки списков списков списков 2D массивов numpy правильного размера, но я не уверен, как передать их в Fortran с помощью f2py, или если это вообще возможно. Любые идеи будут оценены. Спасибо!
Комментарии:
1. В чем значение первых 4 индексов? Определяет ли каждый значение другой переменной или что-то в этом роде? Другими словами, почему каждая 2D-матрица определяется 4 измерениями / переменными / адресами?
2. @JoeTodd да, каждый индекс ссылается на значение определенной переменной. Однако переменные не просто линейно преобразуют матрицы или что-то в этом роде, все матрицы совершенно разные (в целом).
3. Вы не хотите иметь маленькие матрицы в последних индексах. Это делает их полностью разбросанными в памяти. Вы хотите, чтобы они были в первых индексах.
4. Массивы массивов могут быть созданы только в Fortran с использованием производных типов. Возможно, вы захотите создать эквивалентный класс, используя ctypes или что-то в этом роде.
Ответ №1:
Определенно думаю, что вы правы, чтобы не оставлять много пустого места — это определенно не будет хорошо масштабироваться.
Как насчет передачи полностью плоского массива и формы каждой из матриц? Тогда вы можете перестроить его на другом конце? Поскольку у вас есть 2D-матрицы, форма каждой матрицы может быть определена двумя целыми числами. Затем, если у вас есть стандартизированный порядок сглаженного массива, вы можете легко восстановить их с другой стороны.
Таким образом, если бы у вас было, например, две матрицы, одна размером 10×10 и одна размером 100×100, вы могли бы передать:
FlatArr(10100) = [your_data]
SizeArr(4) = [10, 10, 100, 100]