Преобразование целых чисел между Python (numpy) и Matlab

У меня есть код Python, в котором я использую numpy для выполнения некоторых вычислений. В моем коде у меня есть некоторая целочисленная переменная «N», которую я использую в качестве индекса.

Затем я использую scipy.io.savemat для использования этого индекса в моем коде Matlab (2017a), и я получаю эту ошибку, когда делаю что-то подобное:

% N is the int variable I have from my python code
>> N
N =
  int64
   1792
>> (1:2)/N
Error using  / 
Integers can only be combined with integers of the same class, or scalar doubles.

По-видимому, «собственные целые числа» Matlab относятся к классу «двойной». Под чем я подразумеваю:

>> N=3
N =
     3
>> class(N)
ans =
    'double'

Если бы я назначил «N» в своем коде Matlab, у меня не было бы проблем с выполнением вышеуказанного кода. Но я назначаю свои переменные в python, а затем конвертирую их в Matlab. Попытка использовать numpy.double для 'N' в моем коде python приводит к предупреждениям numpy, например:

>>> N = numpy.double(100)
>>> numpy.zeros(N)
VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future

Подводя итог, я хочу использовать «N» как целое число в моем коде Python, а затем как двойное число (или что-то еще, что работает как собственное целое число Matlab) в моем коде Matlab. Я думал, что savemat сделает это преобразование за меня, но, вероятно, по другим веским причинам это не так.

Очевидным решением было бы преобразовать целое число в двойное до или после сериализации. Но так как у меня есть огромный словарь с множеством разных переменных, это потребует отслеживания типов каждой из них, чего я бы очень хотел избежать. Я ищу простое более «родное» решение.

Как бы вы предложили решить этот вопрос? Спасибо


person nivniv    schedule 25.04.2017    source источник
comment
np.double(100) создает поплавок. Поэтому np.zeros не любит - использует, но предупреждает. Как насчет того, чтобы сохранить целое число N в Python, но сохранить его как float(N) в файл. У меня Octave, а не MATLAB, поэтому, возможно, я не смогу проверить это для вас.   -  person hpaulj    schedule 25.04.2017
comment
Спасибо @hpaulj, ваше решение потребует отслеживания моих типов в моем огромном словаре, который я конвертирую из Python в Matlab. Вы говорите, что я не совсем ясно выразился в своем вопросе. Я обновил, отредактировал, пожалуйста, проверьте   -  person nivniv    schedule 26.04.2017


Ответы (1)


В дополнение к моему комментарию я попытался сохранить некоторые значения в numpy и загрузить их с помощью октавы:

In [552]: from scipy import io
In [553]: io.savemat('test.mat',dict(N=100, fN=float(100),x=np.arange(100)))

В октаве

>> load test.mat
>> (1:2)/N
ans =
  0  0

>> (1:2)/fN
ans =
   0.010000   0.020000

>> (1:2)/100
ans =
   0.010000   0.020000
>> M=100
M =  100
>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        M           1x1                          8  double
        N           1x1                          4  int32
        ans         1x2                         16  double
        fN          1x1                          8  double
        x           1x100                      400  int32

Так что да, сохранение Python чисел (и массивов) в виде чисел с плавающей запятой ближе всего к записи этих значений в MATLAB/Octave.

>> (1:2)/double(N)
ans =
   0.010000   0.020000

также работает для преобразования импортированных значений в число с плавающей запятой

person hpaulj    schedule 25.04.2017