Python numpy:为浮点数组创建二进制掩码,而不分配中间数组

Python numpy:为浮点数组创建二进制掩码,而不分配中间数组,python,arrays,numpy,Python,Arrays,Numpy,我有两个形状相同的numpy浮点数组:data和mask。我想根据数据中的值填充掩码的值。当数据中的元素值等于“可接受值”(见下文)之一时,则掩码中的相应项应设置为1.0,否则应设置为0.0 有两种可能的情况: 可接受的值都是有限数 可接受值为除0.0以外的所有有限数 如何在没有任何额外阵列分配的情况下实现上述目标?对于第一个场景,我可以使用numpy.isfinite和out参数。但是第二种情况呢numpy。其中无法使用,因为它需要创建索引的中间数组。我能想到的唯一解决方案是将numpy数组传

我有两个形状相同的numpy浮点数组:
data
mask
。我想根据
数据
中的值填充
掩码
的值。当
数据
中的元素值等于“可接受值”(见下文)之一时,则
掩码
中的相应项应设置为1.0,否则应设置为0.0

有两种可能的情况:

  • 可接受的值都是有限数
  • 可接受值为除0.0以外的所有有限数
  • 如何在没有任何额外阵列分配的情况下实现上述目标?对于第一个场景,我可以使用
    numpy.isfinite
    out
    参数。但是第二种情况呢
    numpy。其中
    无法使用,因为它需要创建索引的中间数组。我能想到的唯一解决方案是将numpy数组传递给C并在那里执行。然而,我想知道是否也有一个纯粹的numpy解决方案


    谢谢。

    也许使用
    np.isfinite
    函数的
    where
    参数过滤掉等于零的元素可以达到您想要的效果?但是,它比使用其他布尔数组的其他选项慢

    import numpy as np
    
    # Dummy data
    data = np.tile([0,np.inf,2,3,4,5], 10000000).astype(float)
    mask = np.zeros_like(data, dtype = float)
    
    # First scenario
    np.isfinite(data, out = mask)
    
    # Second scenario 
    mask = np.zeros_like(data, dtype = float)
    np.isfinite(data, out = mask, where = data != 0)
    # Faster method using intermediate boolean arrays
    np.bitwise_and(np.isfinite(data), data != 0, out = mask)
    

    也许使用
    np.isfinite
    函数的
    where
    参数过滤掉等于零的元素可以达到您想要的效果?但是,它比使用其他布尔数组的其他选项慢

    import numpy as np
    
    # Dummy data
    data = np.tile([0,np.inf,2,3,4,5], 10000000).astype(float)
    mask = np.zeros_like(data, dtype = float)
    
    # First scenario
    np.isfinite(data, out = mask)
    
    # Second scenario 
    mask = np.zeros_like(data, dtype = float)
    np.isfinite(data, out = mask, where = data != 0)
    # Faster method using intermediate boolean arrays
    np.bitwise_and(np.isfinite(data), data != 0, out = mask)
    

    你需要的不是布尔掩码吗?理想情况下,
    掩码
    数组也应该是一个浮点数组(只是在我的帖子中阐明了这一点)。尽管如此,我并不认为不同类型的
    掩码
    数组的解决方案会有很大差异。数组创建是否真的是算法中的瓶颈?为什么?您是遇到了内存错误,还是只是希望节省时间?布尔掩码不是您所需要的吗?理想情况下,
    掩码
    数组也应该是浮点数组(在我的帖子中对此进行了澄清)。尽管如此,我并不认为不同类型的
    掩码
    数组的解决方案会有很大差异。数组创建是否真的是算法中的瓶颈?为什么?您是遇到内存错误,还是只是希望节省时间?这两种方法都会创建临时
    数据!=0
    array。如果
    mask
    bool
    dtype,则所有方法都会更快。@hpaulj您当然是对的。不过,他在问题中为掩码数组指定了一个
    float
    dtype。这两种方法都创建了一个临时
    data!=0
    array。如果
    mask
    bool
    dtype,则所有方法都会更快。@hpaulj您当然是对的。不过,他在问题中为掩码数组指定了一个
    float
    dtype。