Python: создайте 3D-массив, используя значения другого 3D-массива, которые соответствуют условию

В основном я пытаюсь взять средневзвешенное значение набора 3D-данных, но только для отфильтрованного подмножества данных, где фильтр основан на другом (2D) массиве. Форма 2D-данных соответствует первым двум измерениям 3D-данных и, таким образом, повторяется для каждого среза в 3-м измерении.

Что-то вроде:

import numpy as np

myarr = np.array([[[4,6,8],[9,3,2]],[[2,7,4],[3,8,6]],[[1,6,7],[7,8,3]]])
myarr2 = np.array([[7,3],[6,7],[2,6]])
weights = np.random.rand(3,2,3)

filtered = []
for k in range(len(myarr[0,0,:])):
    temp1 = myarr[:,:,k]
    temp2 = weights[:,:,k]
    filtered.append(temp1[np.where(myarr2 > 5)]*temp2[np.where(myarr2 > 5)])

average = np.array(np.sum(filtered,1)/len(filtered[0]))

Я беспокоюсь об эффективности здесь. Можно ли векторизовать это, чтобы мне не нужен цикл, или есть другие предложения, чтобы сделать это более эффективным?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самая очевидная проблема с эффективностью, даже если не учитывать цикл, заключается в том, что np.where(...) вызывается несколько раз внутри цикла при одном и том же условии! Вы можете просто сделать это один раз заранее. Кроме того, нет необходимости в петле. Ваша операция в основном равна:

mask = myarr2 > 5
average = (myarr[mask] * weights[mask]).mean(axis=0)

np.where тоже не нужен.

myarr2 — это массив формы (i, j) с теми же первыми двумя размерами, что и myarr и weight, которые имеют некоторую форму (i, j, k).

Таким образом, если в логической маске n есть элементы myarr2 > 5 True, вы можете применить их к другим массивам для получения элементов (n, k) (взяв все элементы по третьей оси, когда в определенной позиции [i, j] есть значение True).

Другие вопросы по теме