2017-01-10 17 views
0

Я пишу скрипт python, из которого я надеюсь назвать функцию Matlab anovan. я попытался основной тест этой функции в файле test.txt, который содержит 3 колонки:Вызов функции Matlab из python: «initializer должен быть прямоугольной вложенной последовательностью»

1.472008228227131532e+01 1.000000000000000000e+00 1.000000000000000000e+00 
1.423892587976163249e+01 2.000000000000000000e+00 1.000000000000000000e+00 
1.434051782779769013e+01 3.000000000000000000e+00 1.000000000000000000e+00 
1.478373164841650045e+01 4.000000000000000000e+00 1.000000000000000000e+00 
1.463143763527341612e+01 5.000000000000000000e+00 1.000000000000000000e+00 
1.580723346731706513e+01 6.000000000000000000e+00 1.000000000000000000e+00 
1.964295632547030124e+01 1.000000000000000000e+00 2.000000000000000000e+00 
1.922724696768608510e+01 2.000000000000000000e+00 2.000000000000000000e+00 
1.886686329445662480e+01 3.000000000000000000e+00 2.000000000000000000e+00 
1.960702674675711066e+01 4.000000000000000000e+00 2.000000000000000000e+00 
1.983434584140020007e+01 5.000000000000000000e+00 2.000000000000000000e+00 
2.050709640103466569e+01 6.000000000000000000e+00 2.000000000000000000e+00 

Этот файл импортируется как массив data. В MATLAB, функция anovan будет называться следующим образом:

anovan(data(:,1),{data(:,2),data(:,3)}) 

В питона, я пытался вызвать функцию так:

import matlab.engine 
eng = matlab.engine.start_matlab() 
data = np.genfromtxt('test.txt') 
eng.anovan(matlab.double(data[:,0]),matlab.int8(data[:,1:2])) 

К сожалению, это дает следующее сообщение об ошибке:

ValueError: initializer must be a rectangular nested sequence 

Я вижу, что есть проблема в передаче последних двух столбцов массива функции, но я не уверен в решении. Мы ценим любые предложения.

+0

Аргумент разреза '1: 2' занимает всего один столбец, а именно' 1'. Вы можете попробовать '1: 3' или лучше просто' 1: '(все от' 1' до конца). Сторона примечания: пожалуйста, предоставьте полную трассировку, чтобы каждый мог быть уверен в том, откуда именно возникает ошибка. –

ответ

0

У меня теперь это получилось. Проблема была в формате данных, переданных функции.

#convert grouping columns to integer lists 
list1 = data[:,1].tolist() 
for i in range(0,len(list1)):                     
    list1[i] = int(list1[i]) 
list2 = data[:,2].tolist() 
for i in range(0,len(list2)):                     
    list2[i] = int(list2[i]) 
#The following command now works 
eng.anovan(matlab.double(data[:,0].tolist()),[matlab.int8(list1),matlab.int8(list2)])