你能不能用开始和停止规则对一个numpy 2D数组进行切片,而不是在索引处,而是在大于1的值处?

kqqjbcuj  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(79)

我通过以下代码将geotiff LiDAR高程曲面转换为numpy数组:
example_array = np.array(geotiff_surface)
该数组由数百个值乘数百个值组成,但可以简化为以下示例:

example_array = [[ 0, 0, 0, 1, 1, 0, 0, 0]
                 [ 0, 0, 2, 2, 2, 2, 0, 0]
                 [ 0, 3, 3, 3, 3, 0, 0, 0]
                 [ 4, 4, 4, 4, 4, 4, 0, 0]
                 [ 0, 0, 0, 5, 5, 0, 0, 0]]

在其他人的帮助下,我试图用下面的代码对2D数组进行切片,以将特定位置的值增加1000:

sub_array = example_array[1:-1, 1:-1]
sub_array = [sub_array > 1] += 1000

希望得到下面正确的示例数组:

correct_example_array = [[ 0,  0,    0,    1,    1,   0, 0, 0]
                         [ 0,  0,    2,   1002, 1002, 2, 0, 0]
                         [ 0,  3,   1003, 1003,  3,   0, 0, 0]
                         [ 4, 1004, 1004, 1004, 1004, 4, 0, 0]
                         [ 0,  0,    0,    5,    5,   0, 0, 0]]

而实际上我的当前代码给我的是这个数组:

incorrect_example_array = [[ 0,  0,    0,    1,    1,    0,   0, 0]
                             [ 0,  0,   1002, 1002, 1002, 1002, 0, 0]
                             [ 0, 1003, 1003, 1003, 1003,  0,   0, 0]
                             [ 4, 1004, 1004, 1004, 1004, 1004, 0, 0]
                             [ 0,   0,    0,    5,    5,    0,  0, 0]]

有没有一种方法可以让切片理解跳过列表中的零,并在大于1的值中开始切片[1:-1]?

yk9xbfzb

yk9xbfzb1#

这里有一个方法来做到这一点(可能不是很好):

for i in range(example_array.shape[0]):
    if len(np.where(example_array[i]!=0)[0][1:-1])>0:
        example_array[i][np.where(example_array[i]!=0)[0][1:-1]] = example_array[i][example_array[i]!=0][1:-1]+1000
print(example_array)

相关问题