2016-06-07 3 views
5

У меня есть 3-мерный массив, который я хочу скрыть, используя двумерный массив, который имеет те же размеры, что и два самых правых из 3-мерного массива. Есть ли способ сделать это без написания следующего цикла?Маска 3d массив с 2d маской в ​​numpy

import numpy as np 

nx = 2 
nt = 4 

field3d = np.random.rand(nt, nx, nx) 
field2d = np.random.rand(nx, nx) 

field3d_mask = np.zeros(field3d.shape, dtype=bool) 

for t in range(nt): 
    field3d_mask[t,:,:] = field2d > 0.3 

field3d = np.ma.array(field3d, mask=field3d_mask) 

print field2d 
print field3d 

ответ

6

Без петли вы можете написать:

field3d_mask[:,:,:] = field2d[np.newaxis,:,:] > 0.3 

Например:

field3d_mask_1 = np.zeros(field3d.shape, dtype=bool) 
field3d_mask_2 = np.zeros(field3d.shape, dtype=bool) 

for t in range(nt): 
    field3d_mask_1[t,:,:] = field2d > 0.3 

field3d_mask_2[:,:,:] = field2d[np.newaxis,:,:] > 0.3 

print((field3d_mask_1 == field3d_mask_2).all()) 

дает:

Правда

5

Там в numpy.broadcast_to (новый в Numpy 1.10.0):

field3d_mask = np.broadcast_to(field2d > 0.3, field3d.shape) 
+1

Это кажется намного лучше (больше numpythonic?), Чем принято отвечать. Обычно передача не требует копирования n-времени данных. Он просто имитирует его, устанавливая шаг соответственно. –

+0

Да, на самом деле опция «numpy.newaxis» в ответе @ Bart теперь предупреждает: «VisibleDeprecationWarning: boolean index не соответствует индексированному массиву по размеру 2; размерность 3, но соответствующая булева размерность равна 1' – Benjamin

+0

@Benjamin; с которым Python/Numpy версии? Я использую 'np.newaxis' в течение месяцев ++ теперь с Python 3.6.1 и Numpy 1.13.0 без предупреждения. – Bart

Смежные вопросы