问题描述
我想让代码基于布尔映射对数组的指定元素执行某些操作。
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