用户定义的索引用np.nan替换np.array值的最简洁方法

时间:2016-03-28 12:35:06

标签: python arrays

关于掩模2-d np.array数据的一个问题。

例如:

  1. 一个2-n np.array value,形状为20 x 20.
  2. 索引t = [(1,2),(3,4),(5,7),(12,13)]
  3. 如何用value中的(y,x)掩盖二维数组index

    通常,替换为np.nan是基于特定值,如y[y==7] = np.nan

    在我的示例中,我想用 np.nan 替换值特定位置。

    目前,我可以通过以下方式实现:

    1. 创建一个20 x 20
    2. 形状的新阵列value_mask
    3. 循环value并通过(i,j)== t [k]
    4. 证明位置
    5. 如果为True,value_mask[i,j] = value[i,j]; in verse value_mask[i,j] = np.nan
    6. 我的方法太笨重,特别是对于休数据(3级循环) 是否有一些效率方法来实现这一目标?任何建议都会很感激。

2 个答案:

答案 0 :(得分:4)

你快到了。

您可以将索引数组传递给数组。您可能对1D阵列了解这一点。

对于2D数组,您需要为数组传递一个列表元组(每个轴一个元组;列表中的一个元素(必须具有相同的长度),用于您想要选择的每个数组元素)。你有一个元组列表。所以你只需转换"转换"它。

t1 = zip(*t)

为您提供索引数组的正确形状;您现在可以将其用作任何作业的索引,例如:value[t1] = np.NaN

(如果您还不了解python教程中有很多很好的解释(zip*),那么

答案 1 :(得分:2)

您可以使用np.logical_and

arr = np.zeros((20,20))

您可以按location选择,这只是示例位置

arr[4:8,4:8] = 1

您可以创建与mask

相同形状的arr
mask = np.ones((20,20)).astype(bool)

然后您可以使用np.logical_and

mask = np.logical_and(mask, arr == 1)

最后,您可以将1替换为np.nan

arr[mask] = np.nan