Python 对于数组的不同部分,用不同的值替换数组中的零

Python 对于数组的不同部分,用不同的值替换数组中的零,python,arrays,numpy,list-comprehension,Python,Arrays,Numpy,List Comprehension,我有一个浮点数数组,其大小事先不知道。它和其他浮点数中有零值。 我想用一个特定的值来替换它的零,只用于数组的一部分,比如说数组的前三分之一,第二个三分之一用另一个值,最后三分之一用另一个值 我试图使用my_数组[:my_数组.size//3:]=第一个值作为列表理解的一部分: my_array = np.asarray([first_value for x in my_array[:my_array.size//3:] if x == 0]) 但这将阵列减少到只有前三分之一。如何以上述方式替换

我有一个浮点数数组,其大小事先不知道。它和其他浮点数中有零值。 我想用一个特定的值来替换它的零,只用于数组的一部分,比如说数组的前三分之一,第二个三分之一用另一个值,最后三分之一用另一个值

我试图使用
my_数组[:my_数组.size//3:]=第一个值
作为列表理解的一部分:

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

让我们尝试使用数组长度的循环,该数组长度不能总是按部分的数量来划分

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