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

Can you slice a numpy 2D array with start and stop rules not at an index but at values greater than 1?

提问人:Patstro 提问时间:5/12/2023 更新时间:5/12/2023 访问量:71

问:

我已通过以下代码将 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]?

python 数组 numpy slice

评论

0赞 Barmar 5/12/2023
有帮助吗?np.where()
0赞 hpaulj 5/12/2023
语法错误。... = [...] += ..,
0赞 hpaulj 5/12/2023
看一个.这没有外行和列。 大小相同 (n-2,n-2)。单独查看布尔数组。已应用索引。sub_arrayexamplesub_array > 1
0赞 hpaulj 5/12/2023
你做到了吗?.你看了之后吗?它应该是相同的,加上外行和列。.当怀疑测试每个步骤。sub_array[sub_array > 1] += 1000example
0赞 Patstro 5/13/2023
大家,谢谢你的评论。sub_array与我要完成的任务不符。子数组采用第一个和最后一个列表,这是正确的,但错误地将 1000 添加到我尝试更改的值中。我希望将 1000 添加到大于 1 的值中,而不是将每个列表中大于 1 的第一个或最后一个值添加到correct_example_array中。似乎从 [1:-1] 开始切片并没有考虑 0,而是切片,即使没有可操作的值。我将回顾 np.where,因为它看起来很有希望。谢谢

答:

0赞 Shaig Hamzaliyev 5/12/2023 #1

这是一种方法(可能不是很好):

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)