【问题标题】:Efficient ways to iterate through a 3D numpy array迭代 3D numpy 数组的有效方法
【发布时间】:2021-03-07 20:25:15
【问题描述】:

我有一个 vtkVolume,我必须检查所有体素以在某些列表中保持点的坐标具有特定值。例如,如果可能的值为 3(例如 0、1、2),我必须检查体积的所有体素,并在 3 个不同的列表中保存值为 0 的点的坐标,那些具有值 1 和值 2。

使用 numpy 最有效的方法是什么?我尝试使用一些经典的嵌套 for 循环来迭代具有形状 (512, 512, 359) 的整个体积,但耗时太长。

【问题讨论】:

  • 没有一种有效的迭代方式,至少没有 Python 代码。 numpy 编译的方法可以有效地迭代,但您仅限于提供的方法。有像 numbacython 这样的工具用于编写您自己的编译代码。但是对于 Python 中的迭代,列表,甚至是嵌套列表,都比数组好。您需要阅读更多 numpy 基础知识。
  • 其实我是在求一些numpy的内置方法,因为我用numpy.place()在给定条件下替换值,速度非常快。为此,它必须遍历整个卷,这正是我想要有效地做的事情。感谢您的建议

标签: python numpy loops


【解决方案1】:

超级简单:

a = np.random.randint(3, size=(3,3,3))

# array([[[0, 2, 1],
#         [1, 1, 0],
#         [1, 0, 2]],
# 
#        [[2, 1, 2],
#         [2, 0, 2],
#         [1, 0, 1]],
# 
#        [[0, 2, 2],
#         [0, 0, 1],
#         [2, 2, 2]]])

i0 = np.where(a==0)

# (array([0, 0, 0, 1, 1, 2, 2, 2], dtype=int64),
#  array([0, 1, 2, 1, 2, 0, 1, 1], dtype=int64),
#  array([0, 2, 1, 1, 1, 0, 0, 1], dtype=int64))

a[i0[0], i0[1], i0[2]]

# array([0, 0, 0, 0, 0, 0, 0, 0])

其他值相同:

i1 = np.where(a==1)
i2 = np.where(a==2)

【讨论】:

  • 我尝试了这个解决方案,但我需要具有该值的点的坐标,而不是值本身。在这种情况下,对于 label=0 我必须得到一个列表,其中包含数组中点的坐标,值为 0
  • 是的,他们在i0, i1, i2 中,正如我所展示的。最后一行a[i0[0], i0[1], i0[2]] 只是为了说明它们实际上是您想要的。
  • 你是对的,我的错。这正是我所需要的,非常感谢!
猜你喜欢
  • 2015-06-12
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 2010-11-21
  • 2015-08-28
  • 2017-03-28
相关资源
最近更新 更多