【问题标题】:Numpy/Python: Array iteration without for-loopNumpy / Python:没有for循环的数组迭代
【发布时间】:2012-11-28 02:56:06
【问题描述】:

所以这是另一个 n 维数组问题: 我希望能够将 n 维数组中的每个值与其邻居进行比较。例如,如果 a 是二维数组,我希望能够检查:

a[y][x]==a[y+1][x]

适用于所有元素。所以基本上检查所有维度的所有邻居。现在我正在通过:

for x in range(1,a.shape[0]-1):
   do.something(a[x])

使用了数组的形状,这样我就不会在边缘遇到超出范围的索引。因此,如果我想在 n-D 中对数组中的所有元素执行类似的操作,我确实需要 n 个看起来不整洁的 for 循环。有没有办法通过切片来做到这一点?像 a==a[:,-1,:] 这样的东西还是我完全理解错了?有没有办法告诉切片在最后停止?或者是否会有另一种想法让事情以完全不同的方式工作?屏蔽数组? 问候乔尼

【问题讨论】:

  • 你如何处理边缘的索引?
  • 这正是我直到现在才使用for循环的原因。在边缘,没有 x+1 或 z+1,所以我只迭代直到 shape[0]-1。

标签: python arrays numpy indexing slice


【解决方案1】:

类似:

a = np.array([1,2,3,4,4,5])
a == np.roll(a,1)

返回

array([False, False, False, False,  True, False], dtype=bool

您也可以为更高的维度指定一个轴,但正如其他人所说,您需要以某种方式处理边缘,因为值环绕(正如您可以从名称中猜到的那样)

关于 2D 中更完整的示例:

# generate 2d data
a = np.array((np.random.rand(5,5)) * 10, dtype=np.uint8)

# check all neighbours
for ax in range(len(a.shape)):
    for i in [-1,1]:
        print a == np.roll(a, i, axis=ax)

【讨论】:

  • 所以我猜一个人可以在每个轴的两个方向上移动,并在它们之间有一些逻辑运算符以获得所需的行为
  • 没错,剩下的就看你追求什么结果了
  • 问题是,我不能使用那个,只检查特殊值(例如,只有当值为零时才为真)但我想可以通过比较具有值和另一个逻辑运算的数组(我要弄清楚哪个;))
  • 嗯,重要的一行是np.roll(a, i, axis=ax) - 您将其与什么进行比较,以及您使用什么操作来组合来自不同“班次”的结果取决于问题。如果您有更多详细信息,请发布它们
  • 对于文档问题:我通过这种方式解决了这个专门的问题:import scipy.ndimage as nd a=nd.binary_opening(a) 默认情况下会删除所有定义为正方形连接的元素。该版本实际上运行速度快了 30 倍,并且解决了我的第一篇文章本身的边缘问题。所以我想我会为另一个最近的邻居问题打开另一个问题。感谢大家的贡献。
【解决方案2】:

怎么样:

np.diff(a) != 0

?

如果您需要另一个轴上的邻居,也许可以区分 np.swapaxes(a) 的结果并以某种方式将结果合并在一起?

【讨论】:

  • 你对一个数组所有值的逻辑“或”有什么想法吗?
  • @JonathanSchock:使用类似(a == 3. | a < 0)的东西。
  • @tiago:在上下文中我没有得到你的答案。 “|”是什么意思做什么?
  • @JonathanSchock:| 是逻辑或。 a == 3.a < 0 的结果是一个布尔数组。当任何条件为True 时,| 操作将返回一个数组True
【解决方案3】:

这也可能有用,它将沿轴 = 1 将每个元素与以下元素进行比较。您显然可以调整轴或距离。诀窍是确保== 运算符的两侧具有相同的形状。

a[:, :-1, :] == a[:, 1:, :]

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2017-03-25
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2012-06-27
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多