简体   繁体   中英

Aggregating 2 NumPy arrays by confidence

I have 2 np arrays containing values in the interval [0,1]. I want to create the third array, containing the most "confident" values, meaning to take elementwise, the number from the array which is closer to 1 or 0. Consider the following example:

[0.7,0.12,1,0.5]
[0.1,0.99,0.001,0.49]

so my constructed array would be:

[0.1,0.99,1,0.49]

You can try this:

c=np.array([a[i] if min(1-a[i],a[i])<min(1-b[i],b[i]) else b[i] for i in range(len(a))])

The result is:

array([ 0.1 ,  0.99,  1.  ,  0.49])
import numpy as np
A = np.array([0.7,0.12,1,0.5])
B = np.array([0.1,0.99,0.001,0.49])

maxi = np.maximum(A,B)
mini = np.minimum(A,B)
# Find where the maximum is closer to 1 than the minimum is to 0
idx = 1-maxi < mini

maxi*idx + mini*~idx

returns

array([ 0.1 ,  0.99,  1.  ,  0.49])

Another way of stating your "confidence" measure is to ask which of the two numbers are furtest away from 0.5 . That is, which of the two numbers x yields the largest abs(0.5 - x) . The following solution constructs a 2D array c with the original arrays as columns. Then we construct and apply a boolean mask based on abs(0.5 - c) :

import numpy as np

a = np.array([0.7,0.12,1,0.5])
b = np.array([0.1,0.99,0.001,0.49])

# Combine
c = np.concatenate((a, b)).reshape((2, len(a))).T
# Create mask
b_or_a = np.asarray(np.argmax(np.abs((0.5 - c)), axis=1), dtype=bool)
mask = np.zeros(c.shape, dtype=bool)
mask[:, 0] = ~b_or_a
mask[:, 1] =  b_or_a
# Applt mask
d = c[mask]
print(d)  # [ 0.1   0.99  1.    0.49]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM