你能使用NumPy的切片功能来在不知道索引的情况下更改数值吗?

huangapple go评论73阅读模式
英文:

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

问题

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

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

我希望能够更改切片中的2,但不确定它们是否始终为2,或它们是否始终位于相同的索引位置。

我知道第一个和最后一个2将始终与0之间以某个值分隔 - 例如,在这个示例中是1。

是否有办法编写一个np.slice,以便能够通过添加1来将2更改为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]
英文:

I have a 2D array with hundreds slices. An example of one of those slices below:

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

I am interested in changing the 2's in the slice but do not know that they will always be 2's or that they will always be in the same index location.

I do know that the first and last 2 will always be separated from the 0's by some value - a 1 in this example.

Is there a way to write a np.slice that will be able to change the 2's into 3's by adding 1, if I do not know the index location?

my code attempt with the help of others is below:

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

but this attempt adds 1 to every value in the list turning the slice into:

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

instead of the desired slice

correct_slice = [0, 0, 1, 3, 3, 3, 1, 0, 0]

答案1

得分: 1

以下是翻译好的部分:

编辑:

来自 @hpaulj 的评论:

> 在这里 where 是可选的。

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

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

example_slice[example_slice == 2] = 3

# 或者

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])
英文:

EDIT:

Comment from @hpaulj:

> where is optional here.

> The key step is example_slice == 2 which tests all array elements to 2. The result is an array of true/false. where converts that to index array(s)

So, you can simply use:

example_slice[example_slice == 2] = 3

# OR

example_slice[example_slice == 2] += 1

Are you looking for np.where:

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

Output:

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

答案2

得分: 0

以下是对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, 如果为True则返回example_slice+1,如果为False则返回example_slice)

输出是

array([0, 0, 1, 3, 3, 3, 1, 0, 0])
英文:

Some supplement to the Corralien. There is a simplified/different version of

> 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)

Output is

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

huangapple
  • 本文由 发表于 2023年5月13日 07:26:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/76240457.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定