Можно ли получить от Фортрана два значения? например, я хочу получить максимальный балл и эту координату из матрицы
# python code
import numpy as np
matrix = np.array([[1, 10, 3, 4, 9],
[2, 1, 0, 9, 13],
[3, 5, 10, 18, 3]])
max_score= 0
column_coord = 0
row_coord = 0
for i in range(len(matrix[:,0])):
for j in range(len(matrix[0,:])):
if matrix[i, j] >= max_score:
# getting max_score, column, row coordinate
max_score= matrix[i, j]
column_coord = i
row_coord = j
print(max_score, column_coord, row_coord)
Этот код работает нормально, но если матрица станет больше, потребуется много времени, чтобы найти нужные мне значения.
Итак, я решил использовать f2py для более быстрого расчета, и это код fortran. cc - длина столбца, а rr - длина строки.
subroutine findthemax(cc, rr, matrix, max_score, col_coord, row_coord)
integer, intent(in) :: cc, rr
integer, intent(in) :: matrix(0:cc, 0:rr)
integer, intent(out) :: max_score, col_coord, row_coord
max_score = 0
col_coord = 0
row_coord = 0
do i = 1, cc
do j = 1, rr
if (matrix(i, j).GE.max_score) then
max_score = matrix(i, j)
col_coord = i
row_coord = j
end if
end do
end do
return
end subroutine
Я хочу получить max_score, col_coord, row_coord, поэтому я импортировал модуль findthemax
(названный findthemax.f90), который я преобразовал с помощью f2py.
import numpy as np
matrix = np.array([[1, 10, 3, 4, 9],
[2, 1, 0, 9, 13],
[3, 5, 10, 18, 3]])
cc = len(matrix[:,0])
rr = len(matrix[0,:])
max_score, column_coord, row_coord = findthemax.findthemax(cc, rr, matrix)
Я не знаю, почему это не работает, и это потому, что я на самом деле не знаю, как вернуть более двух значений с помощью fortran и f2py. Не мог бы кто-нибудь рассказать мне, как
получить несколько значений от fortran?
import findthemax
, чтобы импортировать созданный модуль f2py. После импорта модуля f2py вам может быть очень полезно внимательно просмотреть вывод, например,print(findthemax.__doc__)
иprint(findthemax.findthemax.__doc__)
, таким образом можно решить многие недоразумения, связанные с f2py. - person jbdv   schedule 23.11.2020