我在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
我想在使用numpy的python上做同样的事情然后我这样做:
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
但最后两个命令不起作用。
答案 0 :(得分:3)
第一行(redGrd[:,cols] = -9999
)不起作用,因为python使用zero-based indexing,而Matlab从1开始计数。所以numpy n维数组中的最后一列号码为cols-1
,或仅为-1
(速记)。
如果你来自Matlab,一个非常有用的资源是NumPy for Matlab Users。它列出了很多陷阱,比如这个陷阱。
现在,第二行(redGrd[rows,:] = -9999
)将失败,因为numpy不会尝试自动增加数组的大小,而Matlab会这样做。
从程序员的角度来看,前者更有意义,因为它可以防止你意外更换数组。
如果你想"增加"数组的大小,您必须显式,
redGrd = np.vstack((redGrd, np.zeros(rows - redGrd.shape[0], redGrd.shape[1])))
答案 1 :(得分:1)
初始化时,您将定义一个4x6矩阵:
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]])
当您只有4行时,您无法访问第7行。您应该首先创建一个行x col矩阵,然后根据需要填充值。您可以像这样创建数组:
redGrd = np.zeros((rows, cols))
另外,请注意在python中你的索引是0,所以你应该使用cols -1而不是cols和行-1而不是行
答案 2 :(得分: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]]