Подтвердить что ты не робот

Фильтрации строк в массиве numpy в соответствии со значениями в диапазоне

Пусть массив:

 a =np.array([[1,2],[3,-5],[6,-15],[10,7]])

чтобы получить строки с элементами второго столбца выше -6, можно сделать

>>> a[a[:,1]>-6]
array([[ 1,  2],
   [ 3, -5],
   [10,  7]])

но как получить строки со вторым элементом между -6; 3? Я пробовал:

>>> a[3>a[:,1]>-6]

а также (что вызывает ошибку):

>>> np.ma.masked_inside(a,-6,3)

который дает:

 masked_array(data =
 [[-- --]
  [-- --]
  [6 -15]
  [10 7]],
         mask =
  [[ True  True]
  [ True  True]
  [False False]
  [False False]],
   fill_value = 999999)

но результат не слишком ясен.

Спасибо JP

4b9b3361

Ответ 1

>>> a[ (3>a[:,1]) & (a[:,1]>-6) ]

array([[ 1,  2],
      [ 3, -5]])

Ответ 2

np.ma.masked_inside(a, -6, 3) создаст объект MaskedArray, где значения между -6 и 3 маскируются (то есть, помечены как инвалид). Другими словами, вы фильтруете out значения между -6 и 3. Вместо этого вы должны использовать np.ma.masked_outside(a, -6, 3):

>>> a = np.array([[1,2],[3,-5],[6,-15],[10,2]])
>>> np.ma.masked_outside(a,-6,3)
>>> masked_array(data =
 [[1 2]
 [3 -5]
 [-- --]
 [-- 2]],
             mask =
 [[False False]
 [False False]
 [ True  True]
 [ True False]],
       fill_value = 999999)

Обратите внимание, что с помощью этой функции вы отфильтровываете весь массив, элемент за элементом, который не является тем, что вы хотите.

Подход индексирования, приведенный в другом решении, на сегодняшний день является самым простым и понятным.