Получить количество столбцов элементов, превышающих порог в двумерном массиве - PullRequest
1 голос
/ 13 июня 2019

У меня есть такой массив, и я хотел бы получить возвращенные номера столбцов для каждой строки, где значение превышает порог 0,6:

X = array([[ 0.16,  0.40,  0.61,  0.48,  0.20],
        [ 0.42,  0.79,  0.64,  0.54,  0.52],
        [ 0.64,  0.64,  0.24,  0.63,  0.43],
        [ 0.33,  0.54,  0.61,  0.43,  0.29],
        [ 0.25,  0.56,  0.42,  0.69,  0.62]])

Результат будет:

[[2],
[1, 2],
[0, 1, 3],
[2],
[3, 4]]

Есть ли лучший способ сделать это, чем с помощью двойного цикла for?

def get_column_over_threshold(data, threshold):
    coolumn_numbers = [[] for x in xrange(0,len(data))]
    for sample in data:
        for i, value in enumerate(data):
            if value >= threshold:
                coolumn_numbers[i].extend(i)
    return topic_predictions

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Для каждой строки вы можете запросить индексы, где элементы больше чем 0,6:

result = [where(row > 0.6) for row in X]

Это выполняет необходимые вычисления, но формат result несколько неудобен, так как результатwhere в этом случае - tuple размера 1, содержащий массив NumPy с индексами.Мы можем заменить where на flatnonzero, чтобы получить массив напрямую, а не кортеж.Чтобы получить список списков, мы явно приведем этот массив к списку:

result = [list(flatnonzero(row > 0.6)) for row in X]

(В приведенном выше коде я предполагаю, что вы использовали from numpy import *)

1 голос
/ 13 июня 2019

Используйте np.where, чтобы получить индексы строк, столбцов, а затем используйте те, у которых np.split, чтобы получить список индексов столбцов в качестве выходных данных массивов -

In [18]: r,c = np.where(X>0.6)

In [19]: np.split(c,np.flatnonzero(r[:-1] != r[1:])+1)
Out[19]: [array([2]), array([1, 2]), array([0, 1, 3]), array([2]), array([3, 4])]

Чтобы сделать его более универсальным, который будет обрабатывать строки без какого-либо соответствия, мы могли бы перебрать индексы столбцов, полученные из np.where, и назначить их в инициализированный массив, например:

def col_indices_per_row(X, thresh):
    mask = X>thresh
    r,c = np.where(mask)
    out = np.empty(len(X), dtype=object)
    grp_idx = np.r_[0,np.flatnonzero(r[:-1] != r[1:])+1,len(r)]
    valid_rows = r[np.r_[True,r[:-1] != r[1:]]]
    for (row,i,j) in zip(valid_rows,grp_idx[:-1],grp_idx[1:]):
        out[row] = c[i:j]     
    return out

Пробный прогон -

In [92]: X
Out[92]: 
array([[0.16, 0.4 , 0.61, 0.48, 0.2 ],
       [0.42, 0.79, 0.64, 0.54, 0.52],
       [0.1 , 0.1 , 0.1 , 0.1 , 0.1 ],
       [0.33, 0.54, 0.61, 0.43, 0.29],
       [0.25, 0.56, 0.42, 0.69, 0.62]])

In [93]: col_indices_per_row(X, thresh=0.6)
Out[93]: 
array([array([2]), array([1, 2]), None, array([2]), array([3, 4])],
      dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...