从 3D numpy 数组中删除切片

deleting slices from a 3D numpy array

我有一个 3D numpy 数组(我称之为张量),形状为 (5,8, 15000)

因为一些计算填充了它,张量里面有一些NaN。 最后一个轴显示模拟指数。我有一个过程在计算机上重复了 15,000 次,动态略有改变。

我想遍历所有 15,000 个模拟,并查看与其中一个模拟对应的二维数组(形状 (5,8))。如果 NaN 横跨第二行,横跨二维数组中的所有列(即 [1,:]),我想从 3D 张量中删除模拟。这将对所有 15,000 次模拟重复。

也就是说,新张量的形状应为(5, 8, 15000 - number_of_bad_sims),所有与包含至少 1 个 NaN 的模拟对应的二维数组都被删除。张量的其余部分将保持不变。我不想触摸任何在第二行没有 NaN 的二维数组。

我试过:

# threeDimTensor has shape (5,8, 15000)

for idx in range(threeDimTensor.shape[2]): # for all simulations
    boolean_array = np.isnan(threeDimTensor[1, :, idx]) # check if any of the results is NaN
    condition = False
    for element in boolean_array:
        if element == True and condition == False:
            condition = True
            np.delete(threeDimTensor, idx, axis=2) # along last axis ???

我的问题是如何存储 np.delete() 结果?我不知道我有多少个 NaN,因此我最初无法创建一个 np.zeros(input_shape) 3D 数组来填充非 NaN 的值。

另外,我的np.delete()指令是否正确?

什么是存储“'clean'”新三维张量的正确、有效的方法? 也就是说,如何将这段代码完成为 return 新的三维张量并进一步使用它?

谢谢!

您可以只对整个数组使用 isnan,生成一个数组来屏蔽不良模拟人生,然后将其用于 select 好的模拟人生

我对使用 Numpy 的建议是向量化您的代码,尝试想出一种不需要显式 for 循环的方法:

is_element_nan = np.isnan(threeDimTensor[1, :, :]) # Across your 2nd row
any_nan = np.any(is_element_nan, axis=0) #Flattens the 2d matrix
clean_tensor = threeDimTensor[:, :, ~any_nan] # ~is bitwise not