【问题标题】:Python: slicing a multi-dimensional arrayPython:对多维数组进行切片
【发布时间】:2013-06-21 01:20:18
【问题描述】:

我是 Python 和 numpy 的新手。我已经弄清楚如何分割一维序列:arr[start:end],并访问数组中的一个元素:el = arr[row][col]

尝试类似slice = arr[0:2][0:2](其中arr 是一个numpy 数组)不会给我前2 行和列,而是重复前2 行。我刚刚做了什么,如何沿另一个维度进行切片?

【问题讨论】:

  • arr 是什么数据类型?是列表列表吗?
  • @mgilson 我更新了问题中的类型

标签: python arrays numpy


【解决方案1】:

如果你使用numpy,这很容易:

slice = arr[:2,:2]

或者如果你想要 0,

slice = arr[0:2,0:2]

你会得到同样的结果。

*注意slice 实际上是内置类型的名称。一般来说,我会建议给你的对象一个不同的“名称”。


另一种方式,如果您正在使用列表列表*:

slice = [arr[i][0:2] for i in range(0,2)]

(请注意,这里的 0 是不必要的:[arr[i][:2] for i in range(2)] 也可以。)。

我在这里所做的是一次取每个所需的第 1 行 (arr[i])。然后,我从该行中切出我想要的列并将其添加到我正在构建的列表中。

如果你天真地尝试:arr[0:2] 你会得到前 2 行,如果你再次切片 arr[0:2][0:2],你只是再次切片前两行。

*这实际上也适用于 numpy 数组,但与我上面发布的“本机”解决方案相比,它会很慢。

【讨论】:

  • 那么,arr[0:2][0:2]arr[row][col] 相比实际上做了什么?
  • @mgilson 我厌倦了这个并且得到了一些相当奇怪的结果。假设我有a=[[1,2,3],[4,5,6],[7,8,9]] 然后是a[0][:]=[1, 2, 3] 但奇怪的是a[:][0] 仍然是[1,2,3]。我会说这应该是[1,4,7]。如果您能告诉我这里出了什么问题,我将不胜感激。
  • @AlexanderCska 其实这并不奇怪。这两个表达式基本上是“获取a 的第一个元素并返回它的副本”和“复制a 并返回副本的第一个元素”。修复方法是 [x[0] for x in a],或者,如果您使用的是 numpya[:, 0]
  • @mgilson 好的,我正在尝试将 FORTRAN 表示法应用于 python,现在我发现事情有点复杂。
  • @mgilson 我现在明白了,在正常情况下a[:] 是一个副本,用于避免多个指针引用相同的内存位置。我只是混淆了C 和 python 语法。
猜你喜欢
  • 2016-02-20
  • 2015-10-15
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多