【问题标题】:Iterating through a subset of dimensions遍历维度的子集
【发布时间】:2019-01-26 15:37:26
【问题描述】:

我想遍历 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])

解决方案对我来说看起来不是很优雅,只是想知道是否有更优雅的解决方案。

【问题讨论】:

  • “默认”的打印重要吗?还是只是看到默认为周末?
  • 你知道exclude_times[level,window,:]exclude_times[level][window]是同一个索引吗?

标签: python numpy


【解决方案1】:

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

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

表达式d[None, None, :] 将两个new axes 引入d 的视图中,使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)

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

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

你必须做几个额外的步骤才能正确重塑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2012-03-21
    • 2012-04-12
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2011-04-21
    • 2019-08-03
    相关资源
    最近更新 更多