【问题标题】:deleting slices from a 3D numpy array从 3D numpy 数组中删除切片
【发布时间】:2021-04-12 12:55:55
【问题描述】:

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

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

我想查看所有 15,000 次模拟,并查看与此类模拟相对应的二维数组(形状为 (5,8))。如果第二行有一个 NaN,在 2D 数组中的所有列(即[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() 指令正确吗?

存储“干净”的新三维张量的正确、有效方法是什么? 也就是如何完成这段代码,返回新的三维张量并进一步使用?

谢谢!

【问题讨论】:

  • np.delete 返回一个新数组。最好使用一次,并列出要删除的所有索引的列表(或数组)。或者更好的是,考虑你想要保留的燕鸥。

标签: python arrays numpy data-science tensor


【解决方案1】:

你可以对你的整个数组使用 isnan,生成一个数组来屏蔽坏的模拟人生,然后用它来选择好的模拟人生

我对使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多