Как создать маску для значений nd в массиве 2d NumPy? - PullRequest
0 голосов
/ 12 мая 2019

Если я хочу создать маску в зависимости от значения 1d в массиве 2d:

a = np.array([[3, 5], [7, 1]])
threshold = 2
mask = a > threshold
print(a)
print(mask)

Я получу:

[[3 5]
 [7 2]]
[[ True  True]
 [ True False]]

Как создать такую ​​маску для2d массив с nd значениями?Как в следующем примере 2d значений и 2d порога в 2d массиве:

b = np.array([[[1, 5], [3, 5]], [[4, 4], [7, 2]]])
threshold = 2, 4
print(b)

выглядит так:

[[[1 5]
  [3 5]]

 [[4 4]
  [7 2]]]

[1, 5], [3, 5], [4, 4] и[7, 2] являются примерными 2d значениями.Пороговое значение, установленное в threshold, для первого значения равно 2, а для второго - 4:

  • , ячейка для [1, 5] должна составлять False, поскольку 1 > 2 == False и 5 > 4 == True
  • ячейка для [3, 5] должна составлять True, поскольку 3 > 2 == True и 5 > 4 == True
  • ячейка для [4, 4] должна составлять False, начиная с 4 > 2 == True и4 > 4 == False
  • ячейка для [7, 2] должна быть False, поскольку 7 > 2 == True и 2 > 4 == False

Что мне нужно сделать, чтобы получить соответствующую маску?

[[ False  True]
 [ False False]]

1 Ответ

2 голосов
/ 12 мая 2019

numpy транслируемое сравнение на самом деле справляется с этим довольно хорошо для вас. Просто создайте массив threshold a 1D и подтвердите all вдоль последней оси.

t = np.array([2, 4])

(b > t).all(-1)

array([[False,  True],
       [False, False]])

Для пояснения, однако, ваш массив на самом деле 3D. Если бы ваш массив был 2D, как показано ниже, это работало бы немного иначе:

arr = np.array([[1, 5],
                [3, 5],
                [4, 4],
                [7, 2]])

(arr > t).all(-1)

array([False,  True, False, False])
...