将数组中的零替换为数组不同一半的不同值



我有一个浮动数组,其大小事先未知。它和其他浮点中都有零值。我只想将其零替换为数组的一部分的某个值,比如数组的前三分之一,第二个三分之一用另一个值,最后三分之一再换一个值。

我试图使用这里建议的my_array[:my_array.size//3:] = first_value作为列表理解的一部分:

my_array = np.asarray([first_value for x in my_array[:my_array.size//3:] if x == 0])

但这将阵列减少到仅其前三分之一。如何以上述方式替换零?

您可以使用掩码首先获得所需的索引,然后在没有循环的情况下一次为它们分配任何值:

mask = np.where(my_array==0)[0]
my_array[mask[mask<my_array.size//3]] = first_value
my_array[mask[np.logical_and(mask>=my_array.size//3, mask<2*my_array.size//3)]] = second_value
my_array[mask[mask>=2*my_array.size//3]] = third_value

如果你想把你的数组分成更多的部分,我建议你循环这个代码。

请注意,这将不起作用,因为它会创建数组的副本并更改:

#THIS DOES NOT WORK, it changes values of a copy of my_array and not the original array itself
my_array[my_array==0][:my_array.size//3] = first_value

让我们尝试使用一个循环来计算数组长度,该长度不能总是由的部分数来划分

import numpy as np
number_of_parts=3
length_of_parts=int(np.ceil(my_array.size/number_of_parts))
Values=[1,2,3]
Parts=[[counter*length_of_parts,min((counter+1)*length_of_parts,my_array.size)]for counter in range(number_of_parts)]
for (start,end),Value in zip(Parts,Values):
my_array[start,end][my_array[start,end]==0]=Value

最新更新