Заполнение 2D-матрицы в numpy с использованием цикла for

#python #matlab #numpy

#python #matlab #numpy

Вопрос:

Я пользователь Matlab, пытающийся переключиться на Python.

Используя Numpy, как мне заполнить матрицу внутри for цикла?

Например, матрица содержит 2 столбца, и каждая итерация for цикла добавляет новую строку данных.

В Matlab это было бы:

 n = 100;
matrix = nan(n,2); % Pre-allocate matrix
for i = 1:n
    matrix(i,:) = [3*i, i^2];
end
  

Ответ №1:

Сначала вы должны установить numpy с помощью

 $ pip install numpy
  

Тогда должно сработать следующее

 import numpy as np    
n = 100
matrix = np.zeros((n,2)) # Pre-allocate matrix
for i in range(1,n):
    matrix[i,:] = [3*i, i**2]
  

Более быстрая альтернатива:

 col1 = np.arange(3,3*n,3)
col2 = np.arange(1,n)
matrix = np.hstack((col1.reshape(n-1,1), col2.reshape(n-1,1)))
  

Еще быстрее, как предложил Divakar

 I = np.arange(n)
matrix = np.column_stack((3*I, I**2))
  

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

1. Или I = np.arange(n) и затем np.column_stack((3*I, I**2)) .

2. Спасибо за совет 🙂

3. Имейте в виду, что это не матрицы, несмотря на имя переменной. Это массивы. Массивы используются так же, как и матрицы, но работают по-разному несколькими способами, такими как поддержка менее двух измерений и использование поэлементных операций по умолчанию. Numpy предоставляет класс matrix, но вы не должны его использовать, потому что большинство других инструментов ожидают numpy-массива.

Ответ №2:

Это очень питоническая форма для создания списка, который вы можете легко поменять местами, например, для np.array, set, generator и т.д.

 n = 10

[[i*3, i**2] for i, i in zip(range(0,n), range(0,n))]
  

Если вы хотите добавить еще один столбец, это не проблема. Просто

 [[i*3, i**2, i**(0.5)] for i, i in zip(range(0,n), range(0,n))]