您可以使用 Numpy Slice 在没有已知索引的情况下更改值吗?

Can you use Numpy Slice to Change values without known Index?

提问人:Patstro 提问时间:5/13/2023 更新时间:6/5/2023 访问量:52

问:

我有一个包含数百个切片的 2D 数组。以下是其中一个切片的示例:

example_slice = [0, 0, 1, 2, 2, 2, 1, 0, 0]

我有兴趣更改切片中的 2,但不知道它们将永远是 2 或它们将始终位于同一索引位置。

我确实知道第一个和最后一个 2 将始终与 0 相隔某个值 - 在本例中为 1。

如果我不知道索引位置,有没有办法编写一个 np.slice 可以通过添加 2 将 1 更改为 3?

我在其他人的帮助下尝试的代码如下:

example_array = np.array(2D_Surface)
sub_array = example_array[:, 1:-1]
sub_array[sub_array > 1] += 1

但是,此尝试将 1 添加到列表中的每个值,从而将切片转换为:

incorrect_slice = [0, 0, 2, 3, 3, 3, 2, 0, 0]

而不是所需的切片

correct_slice = [0, 0, 1, 3, 3, 3, 1, 0, 0]
python numpy 切片

评论

0赞 hpaulj 5/13/2023
没有.数组索引,无论是否按位置,都是按位置,而不是按值。np.sliceslice

答:

1赞 Corralien 5/13/2023 #1

编辑:

@hpaulj评论:

where在这里是可选的。

关键步骤是 example_slice == 2,它将所有数组元素测试为 2。结果是一个 true/false 数组。where 将其转换为索引数组

因此,您可以简单地使用:

example_slice[example_slice == 2] = 3

# OR

example_slice[example_slice == 2] += 1

您在寻找 np.where 吗:

example_slice = np.array([0, 0, 1, 2, 2, 2, 1, 0, 0])
example_slice[np.where(example_slice == 2)] = 3

输出:

>>> example_slice
array([0, 0, 1, 3, 3, 3, 1, 0, 0])

评论

0赞 hpaulj 5/13/2023
关键步骤是测试所有数组元素。结果是一个 true/false 数组。 将其转换为索引数组。我认为这里是可选的。example_slice == 22wherewhereexample_slice[example_slice == 2] = 3
0赞 Corralien 5/13/2023
@hpaulj 你是完全正确的。很晚了,我没有想太多:p
0赞 Patstro 5/13/2023
这是有道理的!您对自动化该过程有任何建议,即使我不知道数字是 2,我仍然可以将 1 添加到这些位置的任何值中?
0赞 Corralien 5/13/2023
你是什么意思?
0赞 Carraway XU 6/5/2023 #2

对Corralien的一些补充。有一个简化/不同的版本

np.where() 中

example_slice = np.array([0, 0, 1, 2, 2, 2, 1, 0, 0])
np.where(example_slice==2,example_slice+1,example_slice) 
# np.where(condition, if True yield example_slice+1, if False yield example_slice)

输出为

array([0, 0, 1, 3, 3, 3, 1, 0, 0])