2014-12-11 5 views
0

У меня есть следующий код на Matlab:NumPy эквивалент MATLAB матрицы кода

cols = 7; 
rows = 8; 

redGrd = [0 0 0 0 0 1; 1 1 1 1 0 1; 0 0 0 0 0 1; 1 0 1 1 0 1]; 

redGrd(:,1)=-9999; 
redGrd(1,:)=-9999; 
redGrd(:,cols)=-9999; 
redGrd(rows,:)=-9999 

это результат для MATLAB:

-9999 -9999 -9999 -9999 -9999 -9999 -9999 
-9999  1  1  1  0  1 -9999 
-9999  0  0  0  0  1 -9999 
-9999  0  1  1  0  1 -9999 
0  0  0  0  0  0  0 
0  0  0  0  0  0  0 
0  0  0  0  0  0  0 
-9999 -9999 -9999 -9999 -9999 -9999 -9999 

Я хочу сделать то же самое на Python с использованием NumPy я сделайте следующее:

import numpy as np 

cols = 7 
rows = 8 

redGrd = np.array([[0,0,0,0,0,1],[1,1,1,1,0,1],[0,0,0,0,0,1],[1,0,1,1,0,1]]) 

redGrd[:,0] = -9999 
redGrd[0,:] = -9999 
redGrd[:,cols] = -9999 
redGrd[rows,:] = -9999 

Но две последние команды не работают.

ответ

3
  1. Первая строка (redGrd[:,cols] = -9999) не будет работать, так как Python использует zero-based indexing, в то время как в Matlab начинает отсчет с 1. Таким образом, последний столбец в вашем NumPy п-мерный массив имеет номер cols-1, или просто -1 (сокращенная).

    Очень полезный ресурс, если вы поступаете из Matlab, является NumPy for Matlab Users. В нем перечисляется большое количество подводных камней, таких как этот.

  2. Теперь вторая строка (redGrd[rows,:] = -9999) потерпит неудачу, потому что numpy не будет пытаться автоматически увеличивать размер массива, тогда как Matlab делает.

    С точки зрения программиста, первый имеет больше смысла, поскольку он может помешать вам случайно изменить массив.

    Если вы хотите, чтобы «увеличить» размер массива, вы должны будете сделать это явно с

    redGrd = np.vstack((redGrd, np.zeros(rows - redGrd.shape[0], redGrd.shape[1]))) 
    
+0

Привет, я использовал COMAND, но я получил сообщение об ошибке: Traceback (самый последний вызов последним): Файл "", строка 1, в ТипError: тип данных непонятный –

+0

Я забыл сказать спасибо. –

1

С вашей инициализации вы определяете матрицу 4х6:

redGrd = np.array([[0,0,0,0,0,1],[1,1,1,1,0,1],[0,0,0,0,0,1],[1,0,1,1,0,1]]) 

Вы не можете получить доступ к строке 7, если у вас всего 4 строки. Сначала вы должны создать строку x col matrix, а затем заполнить значения по своему усмотрению. Вы можете создать массив так:

redGrd = np.zeros((rows, cols)) 

Кроме того, обратите внимание, что в питоне у вас есть индексы от 0, так что вы должны использовать COLS -1 вместо перевалы и строк -1 вместо строк

1
import numpy as np 
cols, rows = 7, 8 

redGrd = np.mat('0 0 0 0 0 1; 1 1 1 1 0 1; 0 0 0 0 0 1; 1 0 1 1 0 1') 

# pad `redGrd[1:, 1:]` with -9999 on the top, left and right 
redGrd = np.pad(redGrd[1:, 1:], ((1,0),(1,1)), mode='constant', constant_values=-9999) 

# expand `redGrd` to the desired shape 
redGrd.resize((rows, cols))  

# fill the last row with -9999 
redGrd[rows-1, :] = -9999 

print(redGrd) 

дает

[[-9999 -9999 -9999 -9999 -9999 -9999 -9999] 
[-9999  1  1  1  0  1 -9999] 
[-9999  0  0  0  0  1 -9999] 
[-9999  0  1  1  0  1 -9999] 
[ 0  0  0  0  0  0  0] 
[ 0  0  0  0  0  0  0] 
[ 0  0  0  0  0  0  0] 
[-9999 -9999 -9999 -9999 -9999 -9999 -9999]] 
+0

Упрощенный, узнал что-то новое. Спасибо, unutbu! –

+0

Я использую эту команду, но в np.pad у меня есть сообщение об ошибке: Traceback (самый последний вызов последний): Файл «», строка 1, в AttributeError: «модуль» объект не имеет атрибута «Наполнение» –

+0

Я забыл сказать спасибо. –

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