Создать массив 2D numpy с функцией добавления - PullRequest
1 голос
/ 23 марта 2020

Я хочу создать 2D numpy массив измерений Nx2, в python. Я хочу создать это с помощью 2 for петель. Я могу легко построить этот массив в Matlab с помощью следующего кода

matrix = [];

for i = 1:3
    for j = 1:4
        temp = [i, j];
        matrix = [matrix; temp];
    end
end

Я пробовал уже много раз, но не получилось. Обычно ошибка, которую я получаю, связана с размерами массивов, которые не совпадают, когда я запускаю циклы for.

Вывод кода:

matrix =

 1     1
 1     2
 1     3
 1     4
 2     1
 2     2
 2     3
 2     4
 3     1
 3     2
 3     3
 3     4

Ответы [ 3 ]

1 голос
/ 23 марта 2020

Вот функция, которая делает то, что вы хотите, и использует два для циклов. Причина, по которой N равно +1, а M равно +1, заключается в том, что в python функция range () возвращает последовательность чисел, начиная с 0 по умолчанию и увеличивая на 1 (по умолчанию) и заканчивая указанным числом , Так как мы начинаем с 1 вместо 0, нам нужно добавить 1, чтобы фактический диапазон был правильным. ie. 0,4 - это диапазон 4, но 1,4 - это только 3. Надеюсь, это поможет! -Брэк

import numpy as np


def Nx2(N, M):
    matrix=[]
    n = N+ 1
    m= M + 1
    for i in range(1,n):
        for j in range(1,m):
            temp=[i,j]
            matrix.append(temp)
    final_matrix = np.array(matrix)
    return final_matrix
print(Nx2(3, 4))
1 голос
/ 23 марта 2020
matrix= []

for i in range(1,4):
    for j in range(1,5):
        temp= [i,j]
        matrix.append(temp)

Наконец, вы можете преобразовать список списков в массив numpy, используя matrix = np.array(matrix)

0 голосов
/ 23 марта 2020

Вам действительно не нужен al oop ни в MATLAB, ни numpy для этого. В обоих языках явные циклы имеют тенденцию быть медленными по сравнению с внутренними циклами, которые запускаются при векторизации кода. Дополнительная проблема с добавлением внутри al oop заключается в том, что каждая операция перераспределяет весь массив для добавления нового элемента. Вы хотите избежать добавления и как можно большего количества предварительного выделения.

Оба пакета имеют функцию meshgrid. В numpy вы можете сделать:

ii = np.arange(3) + 1
jj = np.arange(4) + 1
j, i = np.meshgrid(jj, ii)

matrix = np.stack((i.ravel(), j.ravel()), axis=1)

В MATLAB это будет очень похоже:

ii = 1:3;
jj = 1:4;
[i, j] = meshgrid(ii, jj);

matrix = [i(:) j(:)];

Если вам абсолютно необходимо сделать это в al oop с постоянным перераспределением MATLAB l oop очень легко переводится в numpy. Вместо неявного vertcat используйте np.append или np.concatenate:

matrix = np.array((0, 2));

for i in range(1, 4)
    for j in range(1, 5)
        temp = [[i, j]]
        matrix = np.append(matrix, temp, axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...