рассчитать среднее значение многомерного массива с помощью индексов и маскирующего массива

В документации jQuery.fn.on есть хорошее объяснение.

Короче:

Обработчики событий привязаны только к выбранные в данный момент элементы; они должны существовать на странице, когда ваш код делает вызов .on().

Таким образом, в следующем примере #dataTable tbody tr должен существовать до генерации кода.

$("#dataTable tbody tr").on("click", function(event){
    console.log($(this).text());
});

Если на страницу вводится новый HTML-код, предпочтительнее использовать делегированные события для присоединения обработчика событий, как описано ниже.

Делегированные события имеют то преимущество, что они могут обрабатывать события от элементов потомков, которые будут добавлены в документ позже. Например, если таблица существует, но строки добавляются динамически с использованием кода, следующее будет обрабатывать ее:

$("#dataTable tbody").on("click", "tr", function(event){
    console.log($(this).text());
});

В дополнение к их способности обрабатывать события на дочерних элементах, которые еще не созданы, другим преимуществом делегированных событий является их потенциал для гораздо более низких накладных расходов, когда необходимо контролировать многие элементы. В таблице данных с 1000 строками в tbody первый пример кода прикрепляет обработчик к 1000 элементам.

Подход с делегированными событиями (второй пример кода) прикрепляет обработчик события только к одному элементу , tbody, и событию нужно только выровнять один уровень (от щелчка tr до tbody).

Примечание. Делегированные события не работают для SVG .

0
задан HappyPy 28 March 2019 в 00:22
поделиться

2 ответа

Применить маску к m и id_, а затем использовать np.bincount

m =  np.array([[[0.4,0.5],[0.2,0.3]], [[0.8,0.1],[0.7,0.9]]])
id_ = np.array([[[1,2],[2,3]], [[3,1],[3,2]]])
mask = np.array([[[0,1],[1,0]], [[1,1],[1,1]]])

mask = mask.astype(bool)
mm, idm = m[mask], id_[mask]
result = np.bincount(idm, mm)/np.bincount(idm)

result
# array([       nan, 0.1       , 0.53333333, 0.75      ])

result содержит все средства, например result[3] является средним для id_ 3.

Примечание: ваш подход не работает, потому что по соглашению в маскированном массиве маска указывает отсутствующие не правильные данные, другими словами, вам придется инвертировать маску.

0
ответ дан Paul Panzer 28 March 2019 в 00:22
поделиться

Должна работать простая индексация массива:

import numpy as np

m =  np.array([[[0.4,0.5],[0.2,0.3]], [[0.8,0.1],[0.7,0.9]]])
my_id = np.array([[[1,2],[2,3]], [[3,1],[3,2]]])
mask = np.array([[[0,1],[1,0]], [[1,1],[1,1]]])

print(m[(mask != 0) & (my_id == 3)])          # [0.8 0.7]
print(m[(mask != 0) & (my_id == 3)].mean())   # 0.75

Кроме того, id является встроенной функцией, поэтому не называйте переменную это. Это будет затенять встроенный.

0
ответ дан Tomothy32 28 March 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: