基于布尔映射、布尔掩码对特定数组位置的操作

问题描述

我想让代码基于布尔映射对数组的指定元素执行某些操作。

假设我有一个 numpy 数组。

a = np.array([[-2.5,-3.2],[2.3,5.3],[1.9,-2.8]])

我想做某些操作,例如对所有负元素执行 np.ceil() 而不是对正元素执行。

我知道你可以通过这样做来创建一个布尔掩码 mask = a<0

然而,如果你这样做np.ceil(a[mask]),这只会输出array([-2.,-3.,-2.])

我希望输出array([[-2.,-3.],[ 2.3,[ 1.9,-2.]])

我知道你可以写一个循环来做到这一点。我需要一个更简单、更清洁的解决方案。

解决方法

一种简单的方法是:

a[a<0]=np.ceil(a[a<0])
#array([[-2.,-3. ],#       [ 2.3,5.3],#       [ 1.9,-2. ]])

不修改 a 的更好解决方案是使用完全为此目的构建的掩码数组:

np.ma.ceil(np.ma.masked_greater_equal(a,0)).data
#array([[-2.,-2. ]])
,

你可以尝试这样的事情。这是您可以在数字为负数时应用函数 np.ceil 的一种方式,否则就不用管它。

    result = np.array([
        [
            np.ceil(num) if num < 0 else num
            for num
            in s
        ]
        for s
        in a
    ])

您也可以在这里查看 Most efficient way to map function over numpy array

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...