Numpy逻辑合并布尔数组与numpy.NaN

hmae6n7t  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(74)

假设我有两个numpy数组。第一个始终包含ONLYTrue或False值。第二个可能包含TrueFalse**,也可能包含numpy.NaN。我想合并两个数组,这样如果第二个数组没有True或False值(它的值是numpy.NaN),它将从第一个数组的同一位置获取值,否则,它将获取True或False值。困惑?太好了!以下是一些示例:

# example 1
a1 = np.array([True, False, True, False, True], dtype=object)
a2 = np.array([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], dtype=object)
output = a1.combinaficate(a2)
# prints [True, False, True, False, True]

# example 2
a1 = np.array([True, False, True, False, True], dtype=object)
a2 = np.array([np.NaN, True, np.NaN, False, np.NaN], dtype=object)
output = a1.combinaficate(a2)
# prints [True, True, True, False, True]

# example 3
a1 = np.array([True, True, True, True, True], dtype=object)
a2 = np.array([np.NaN, np.NaN, np.NaN, False, np.NaN], dtype=object)
output = a1.combinaficate(a2)
# prints [True, True, True, False, True]

# example 4
a1 = np.array([False, False, False, False, False], dtype=object)
a2 = np.array([np.NaN, np.NaN, True, False, np.NaN], dtype=object)
output = a1.combinaficate(a2)
# prints [False, False, True, False, False]

我知道我可以写一个for循环,但问题的实质是“有没有一种方法可以使用严格的numpy来进行这种计算?“.
谢谢

zvms9eto

zvms9eto1#

这个怎么样?强制转换是必要的,因为np.isnan不喜欢布尔值。如果你愿意使用pandas,你也可以使用pd.isnull,而不进行强制转换。

output = a2.copy()
idx = np.isnan(a2.astype(np.float16))
output[idx] = a1[idx]
5hcedyr0

5hcedyr02#

另一个解决方案:

a2 = np.where(a2 != a2, a1, a2)
print(a2)

例如:

a1 = np.array([False, False, False, False, False], dtype=object)
a2 = np.array([np.NaN, np.NaN, True, False, np.NaN], dtype=object)

a2 = np.where(a2 != a2, a1, a2)
print(a2)

图纸:

[False False True False False]
smtd7mpg

smtd7mpg3#

可以按如下方式进行矢量化:

def serial_combinaficate(a1, a2):
     if isinstance(a2, bool):
        return a2
     else:
        return a1

 combinaficate = np.vectorize(serial_combinaficate)  

 # example 4
 a1 = np.array([False, False, False, False, False], dtype=object)
 a2 = np.array([np.NaN, np.NaN, True, False, np.NaN], dtype=object)
 output = combinaficate(a1, a2)
 print(output)
 # prints [False, False, True, False, False]

相关问题