我想遍历一个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])
该解决方案在我看来并不十分优雅,只是想知道是否还有更优雅的解决方案。
答案 0 :(得分:0)
您可以获得一个2D蒙版,可精确定位设置为默认值的所有窗口/级别组合,如下所示:
mask = (exclude_times == d[None, None, :]).all(axis=-1)
表达式d[None, None, :]
在d
的视图中引入了两个new axes,以使其broadcast正确地变成exclude_times
的形状。另一种方法是使用显式reshape
:np.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()