Проблема с преобразованием кода Matlab sparse () в numpy / scipy с помощью csc_matrix ()

#python #matlab #scipy #sparse-matrix

#python #matlab #scipy #разреженная матрица

Вопрос:

Я немного новичок как в Matlab, так и в Python, поэтому приношу свои извинения, если этот вопрос немного глупый…

Я пытаюсь преобразовать некоторый код Matlab в Python, используя numpy и scipy, и все шло хорошо, пока я не достиг разреженной матрицы, которую кто-то написал. Код Matlab выглядит следующим образом:

 unwarpMatrix = sparse(phaseOrigin, ceil([1:nRead*nSlice*nPhaseDmap]/expan), 1, numPoints, numPoints)/expan;
  

Вот мой код на python (с моим мыслительным процессом), который привел к моей попытке преобразования. Для данного набора данных, с которым я тестировал (как в Matlab, так и в Python):

nread = 64
nslice = 28
nphasedmap = 3200
expan = 100
numpoints = 57344

Таким образом, длина массивов phaseorigin, s и j равна 5734400 (и я подтвердил, что функции, которые создают мой массив phaseorigin, выдают точно такой же результат, что и Matlab)

 #Matlab sparse takes: S = sparse(i,j,s,m,n)
#Generates an m by n sparse matrix such that: S(i(k),j(k)) = s(k)

#scipy csc matrix takes: csc_matrix((data, ij), shape=(M, N))

#Matlab code is: unwarpMatrix = sparse(phaseOrigin, ceil([1:nRead*nSlice*nPhaseDmap]/expan), 1, numPoints, numPoints)/expan;
size = nread*nslice*nphasedmap

#i would be phaseOrigin variable
j = np.ceil(np.arange(1,size 1, dtype=np.double)/expan)

#Matlab apparently treats '1' as a scalar so I should be tiling 1 to the same size as j and phaseorigin
s = np.tile(1,size)

unwarpmatrix = csc_matrix((s,(phaseorigin, j)), shape=(numpoints,numpoints))/expan
  

поэтому, когда я пытаюсь запустить свой код на python, я получаю:

 ValueError: column index exceedes matrix dimensions
  

Этого не происходит, когда я запускаю код Matlab, даже если размеры массива больше определенного размера матрицы…

Что я делаю не так? Я, очевидно, что-то напортачил… Заранее большое спасибо за любую помощь!

Ответ №1:

Проблема в том, что индексы Python начинаются с 0 , тогда как индексы Matlab начинаются с 1 . Таким образом, для array размера 57344 в Python первым элементом будет arr[0] , а последним элементом будет arr[57343] .

Ваша переменная j имеет значения от 1 до 57344 . Вы, вероятно, видите проблему. Создание j такого типа решило бы проблему:

 j = np.floor(np.arange(0,size, dtype=np.double)/expan)
  

Тем не менее, лучше проверить это перед использованием…

Комментарии:

1. Хм… Я не думаю, что это проблема, с которой я столкнулся, потому что len (j) = 5734400 (чего я и хочу), и я хочу j[0] = 1

2.@NJM: длина j не проблема, но max(j) = 57344 . j содержит информацию о столбце, и если под «1» вы подразумеваете первый столбец, то вы, безусловно, хотели бы использовать j[0]=0 Python. Проверьте эту ссылку на наличие различий между Python (numpy amp; scipy) и Matlab: scipy.org/NumPy_for_Matlab_Users

3. Ах, я понимаю, что вы сейчас говорите. Похоже, мне, возможно, придется также просмотреть мою переменную phaseorigin, поскольку ее значение max() также равно 57344.00. Спасибо.