Получить индексы первой и последней строк и столбцов, содержащих немаскированные значения в массивном двумерном массиве - PullRequest
0 голосов
/ 27 сентября 2018

С использованием двумерного маскированного массива в Python, как лучше всего получить индекс первой и последней строк и столбцов, содержащих немаскированное значение?

import numpy as np
a = np.reshape(range(30), (6,5))
amask = np.array([[True, True, False, True, True],
                  [True, False, False, True, True],
                  [True, True, True, False, True],
                  [True, False, False, False, True],
                  [True, True, True, False, True],
                  [True, True, True, True, True]])
a = np.ma.masked_array(a, amask)
print a
# [[-- -- 2 -- --]
#  [-- 6 7 -- --]
#  [-- -- -- 13 --]
#  [-- 16 17 18 --]
#  [-- -- -- 23 --]
#  [-- -- -- -- --]]

В этом примере яхотел бы получить:

  • (0, 4) для оси 0 (поскольку первая строка с немаскированными значениями равна 0, а последняя - 4; шестая строка (строка 5) содержит только маскированныезначения)
  • (1, 3) для оси 1 (поскольку первый столбец с немаскированными значениями равен 1, а последний - 3 (1-й и 5-й столбцы содержат только маскированные значения)).

[Я думал о том, чтобы объединить numpy.ma.flatnotmasked_edges и numpy.apply_along_axis без какого-либо успеха ...]

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вот один на основе argmax -

# Get mask for any data along axis=0,1 separately
m0 = a.all(axis=0)
m1 = a.all(axis=1)

# Use argmax to get first and last non-zero indices along axis=0,1 separately
axis0_out = m1.argmax(), a.shape[0] - m1[::-1].argmax() - 1
axis1_out = m0.argmax(), a.shape[1] - m0[::-1].argmax() - 1
0 голосов
/ 27 сентября 2018

IIUC вы можете сделать:

d = amask==False #First know which array values are masked
rows,columns = np.where(d) #Get the positions of row and column of masked values

rows.sort() #sort the row values
columns.sort() #sort the column values

print('Row values :',(rows[0],rows[-1])) #print the first and last rows
print('Column values :',(columns[0],columns[-1])) #print the first and last columns

Row values : (0, 4)
Column values : (1, 3)

Или

rows, columns = np.nonzero(~a.mask)
print('Row values :',(rows.min(), rows.max())) #print the min and max rows
print('Column values :',(columns.min(), columns.max())) #print the min and max columns

Row values : (0, 4)
Column values : (1, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...