2017-02-04 4 views
0

Я пользователь MATLAB. Что это самый простой способ порт следующий MATLAB скрипт PythonБорьба с динамикой ndarray

a = [] 
for i=1:10 
    for j=1:10 
     a(i,j) = i*j 
    end 
end 

речь идет о динамически использовать np.ndarrays. В MATLAB я могу инициализировать как обычный ndarray (через a = []), не зная его размер, а затем использовать явное индексирование a (i, j). В Python существует метод .append, но при использовании ndarrays это меня смущает, потому что для этого сначала нужно упаковать элемент строки, а затем собрать строки вместе или что-то подобное. Я бы предпочел бы явное индексирование. Возможно ли это с помощью динамических массивов, или это можно сделать только с помощью массивов с фиксированным размером?

Спасибо!

+0

Для циклов и динамического распределения - это плохая практика, в Matlab, как в Python. – UpSampler

+0

Начните с 'a = np.zeros ((10,10), dtype = int)', если вы должны так перебирать. – hpaulj

+0

Массивы MATLAB на самом деле не динамичны. Как и массивы numpy, вы не можете изменять размер массива MATLAB без создания нового массива и копирования всех данных. Просто MATLAB претендует на изменение размеров, а numpy - нет. – TheBlackCat

ответ

2

Посмотрите на дисплей при запуске MATLAB

a = 1 
a = 
    1 2 
a = 
    1 2 3 
a = 
    1 2 3 4 
.... (so on for 100 iterations) 

В Октава я могу сделать:

>> i=1:10 
i = 

    1 2 3 4 5 6 7 8 9 10 

>> j=(1:10)' 
j = 

    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

>> a=i+j 
a = 

    2 3 4 5 6 7 8 9 10 11 
    3 4 5 6 7 8 9 10 11 12 
    4 5 6 7 8 9 10 11 12 13 
    5 6 7 8 9 10 11 12 13 14 
    6 7 8 9 10 11 12 13 14 15 
    7 8 9 10 11 12 13 14 15 16 
    8 9 10 11 12 13 14 15 16 17 
    9 10 11 12 13 14 15 16 17 18 
    10 11 12 13 14 15 16 17 18 19 
    11 12 13 14 15 16 17 18 19 20 

Это делает использование вещания, концепция заимствована из Numpy

In [500]: i=np.arange(1,11) 
In [501]: a = i[:,None] + i 
In [502]: a 
Out[502]: 
array([[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

Это лучшая практика - в numpy, и я смею сказать MATLAB и Octave.

Но если вы должны использовать итерацию сделать что-то вроде

In [503]: a=np.zeros((10,10),int) 
In [504]: for i in range(10): 
    ...:  for j in range(10): 
    ...:   a[i,j]=i+j 

Или с полным списком взорван питона итерации:

In [512]: alist = [] 
In [513]: for i in range(10): 
    ...:  sublist=[] 
    ...:  for j in range(10): 
    ...:   sublist.append(i+j) 
    ...:  alist.append(sublist) 
    ...:  
In [514]: alist 
Out[514]: 
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18]] 
In [515]: np.array(alist) 
Out[515]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]) 

, но я могу генерировать alist более компактно с

alist=[[i+j for i in range(10)] for j in range(10)] 

Когда вы создаете список списков, убедитесь, что в подсписках есть один и тот же leng th - или вы вернетесь к SO с вопросом.

Смежные вопросы