【问题标题】:Numpy: trouble obtaining a 2D slice of 3D arrayNumpy:难以获得 3D 数组的 2D 切片
【发布时间】:2021-10-28 09:04:17
【问题描述】:

在 SO 上也有人问过类似的问题,但从未以我需要的形式提出。

我似乎无法理解 NumPy 切片行为。

假设我有一个形状为 512x512x120 的 Numpy 数组

vol1=some_numpy_array
print(x.shape) #result: (512,512,120)

我想对该数组进行“z 切片”,但最终得到的是 512x120 数组而不是 512x512 数组 例如,我尝试以下代码

zSlice=(vol1[:][:][2]).squeeze()
print(zSlice.shape()) #result: (512,120)

为什么生成的数组形状是(512,120) 而不是(512,512)?我该如何解决这个问题?

【问题讨论】:

    标签: python numpy 3d slice


    【解决方案1】:

    你必须一次切片:

    vol1[:, :, 2].squeeze()
    

    >>> vol1[:, :, 2].squeeze().shape
    (512, 512)
    

    因为重复执行[:] 没有任何作用:

    >>> (vol1[:][:] == vol1).all()
    True
    >>> 
    

    这是因为[:] 获得了整个列表...多次这样做不会改变任何事情。

    【讨论】:

    • 我赞成并接受,但它只会接受一个,两个答案基本相同,所以我接受了另一个,因为它是我页面上的第一个
    • 你知道为什么这个索引在不切片时有效吗(例如vol1[x][y][z])?
    • @MichaelSohnen 因为[:] 切片不会更改数组,而如果您执行[:2] 之类的操作,它会更改数组,而不仅仅是索引:)
    【解决方案2】:

    vol1[:][:][2] 的问题是: vol1[:] 将给出整个数组,然后再次 [:] 给出整个数组,最后 [2] 将索引 2 处的数组提供给外轴,最终 vol1[:][:][2] 只不过是 vol1[2] 这不是什么你想要的。

    你需要拿numpy数组切片:

    vol1[:, :, 2].
    

    现在,它将获取最外轴和外轴的所有项目,但只有索引 2 处的项目用于最内轴。

    【讨论】:

    • 谢谢!这是有道理的,但看起来很奇怪,因为当不切片时,索引按预期工作vol1[x][y][z] 将给出与vol1[x,y,z] 相同的值。
    • @MichaelSohnen,这是真的,因为vol1[x][y][z] 在每个轴的一个索引处工作,所以与vol1[x,y,z] 相同,但[:] 采用整个数组切片,所以是不同的。
    • 我现在看到了……第一个和随后的 [:] 每个都返回一个多维数组,其形状和值与原始数组相同。我不知道为什么我认为 numpy 会为每个 [:] 从数组中展开一层,也许是因为这就是普通列表会发生的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2021-02-19
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多