Итерация по подмножеству измерений - PullRequest
0 голосов
/ 26 января 2019

Я хотел бы перебрать подмножество измерений массива-пустышки и сравнить результирующие элементы массива (которые являются массивами или оставшимися измерениями).

Код ниже делает это:

import numpy

def min(h,m):
    return h*60+m

exclude_times_default=[min(3,00),min(6,55)]
d=exclude_times_default
exclude_times_wkend=[min(3,00),min(9,00)]
w=exclude_times_wkend;

exclude_times=numpy.array([[[min(3,00),min(6,20)],d,d,d,d,d,[min(3,00),min(6,20)],d,d,[min(3,00),min(6,20)]],
                           [d,d,d,d,[min(3,00),min(9,30)],[min(3,00),min(9,30)],d,d,d,d],
                           [[min(20,00),min(7,15)],[min(3,00),min(23,15)],[min(3,00),min(7,15)],[min(3,00),min(7,15)],[min(3,00),min(23,15)],[min(3,00),min(23,15)],d,d,d,d]])

num_level=exclude_times.shape[0]
num_wind=exclude_times.shape[1]
for level in range(num_level):
    for window in range(num_wind):
        if (exclude_times[level,window,:]==d).all():
            print("Default")
            exclude_times[level][window]=w
        print(level,window,exclude_times[level][window])

Решение выглядит не очень элегантно для меня, просто интересно, есть ли более элегантные решения.

1 Ответ

0 голосов
/ 26 января 2019

Вы можете получить 2D-маску, указывающую все комбинации окон / уровней, установленные по умолчанию, как это:

mask = (exclude_times == d[None, None, :]).all(axis=-1)

Выражение d[None, None, :] вводит две новые оси в представление d, чтобы оно транслировало в форму exclude_times. Другой способ сделать это был бы с явным reshape: np.reshape(d, (1, 1, -1)) или d.reshape(1, 1, -1). Есть и много других способов.

Операция .all(axis=-1) уменьшает трехмерную логическую маску вдоль последней оси, давая вам двумерную маску, проиндексированную по уровню и окну.

Для подсчета количества записей по умолчанию используйте np.countnonzero:

nnz = np.countnonzero(mask)

Для подсчета значений по умолчанию для каждого окна:

np.countnonzero(mask, axis=0)

Для подсчета значений по умолчанию для каждого уровня:

np.countnonzero(mask, axis=1)

Помните, что параметр оси - это тот, который вы уменьшаете, а не тот, который вы сохраняете.

Назначение w элементам по умолчанию немного сложнее. Проблема в том, что exclude_times[mask[:, :, None]] является копией исходных данных и не сохраняет форму оригинала вообще.

Вы должны сделать пару дополнительных шагов, чтобы правильно изменить форму:

exclude_times[mask[:, :, None]] = np.broadcast_to(w[None, :], (nnz, 2)).ravel()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...