遍历维度子集

时间:2019-01-26 15:37:26

标签: python numpy

我想遍历一个numpy数组的维度子集,并比较生成的数组元素(是数组还是其余维度)。

下面的代码执行此操作:

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 :(得分:0)

您可以获得一个2D蒙版,可精确定位设置为默认值的所有窗口/级别组合,如下所示:

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

表达式d[None, None, :]d的视图中引入了两个new axes,以使其broadcast正确地变成exclude_times的形状。另一种方法是使用显式reshapenp.reshape(d, (1, 1, -1))d.reshape(1, 1, -1)。还有很多其他方法。

.all(axis=-1)操作沿最后一个轴减少3D布尔蒙版,为您提供按水平和窗口索引的2D蒙版。

要计算默认条目的数量,请使用np.countnonzero

nnz = np.countnonzero(mask)

要计算每个窗口的默认值:

np.countnonzero(mask, axis=0)

要计算每个级别的默认值:

np.countnonzero(mask, axis=1)

请记住,axis参数是您要减少的参数,而不是保留的参数。

w分配给默认元素会有点复杂。问题在于exclude_times[mask[:, :, None]]是原始数据的副本,根本不保留原始数据的形状。

您必须执行几个额外的步骤才能正确重塑:

exclude_times[mask[:, :, None]] = np.broadcast_to(w[None, :], (nnz, 2)).ravel()