Я просматривал все документы в поисках конкретной операции. Слова, которые я бы использовал для этого, являются «наложением» или «маской», но кажущаяся концепция этих слов не соответствует моим.

Я хочу взять два массива, один плотный и один разреженный и объединить их таким образом:

  [ 1, 2,  3, 4,  5 ] 
X [ N, N, 10, N, 12 ] 
= [ 1, 2, 10, 4, 12 ]

Где X - операция, а N - None, или Null, -1, или какой-либо другой специальный символ.

Как это достигается в numpy / python3?

3
faberfedor 17 Авг 2019 в 21:15

2 ответа

Лучший ответ

Вы можете использовать np.where:

# pick special value 
N = -1

dns = [ 1, 2,  3, 4,  5 ] 
sprs = [ N, N, 10, N, 12 ] 

# this is important otherwise the comparison below
# is not done element by element
sprs = np.array(sprs)

# tada!    
np.where(sprs==N,dns,sprs)
# array([ 1,  2, 10,  4, 12])

При вызове с тремя аргументами m,a,b where "смешивает" a и b, принимая элементы из a, где m равен True и из b где это False.

2
Paul Panzer 17 Авг 2019 в 18:47

Вы можете «заполнить» маскированный массив с помощью np.ma.filled(..) [numpy-doc], например:

>>> a
array([1, 2, 3, 4, 5])
>>> b
masked_array(data=[--, --, 10, --, 12],
             mask=[ True,  True, False,  True, False],
       fill_value=999999)
>>> b.filled(a)
array([ 1,  2, 10,  4, 12])
>>> np.ma.filled(b, a)
array([ 1,  2, 10,  4, 12])

Здесь мы, таким образом, заполняем маскированные значения из b соответствующими значениями a.

2
Willem Van Onsem 17 Авг 2019 в 18:22