Python:切片多维数组

Sli*_*ban 42 python arrays numpy

我是Python和numpy的新手.我已经想出如何切割1维序列:arr[start:end]并访问数组中的元素:el = arr[row][col].

尝试类似slice = arr[0:2][0:2](在哪里arr是一个numpy数组)不会给我前两行和列,但重复前两行.我刚才做了什么,以及如何沿着另一个维度切片?

mgi*_*son 61

如果使用numpy,这很容易:

slice = arr[:2,:2]
Run Code Online (Sandbox Code Playgroud)

或者如果你想要0,

slice = arr[0:2,0:2]
Run Code Online (Sandbox Code Playgroud)

你会得到相同的结果.

*请注意,这slice实际上是内置类型的名称.一般来说,我建议给你的对象一个不同的"名字".


另一种方法,如果你正在使用列表列表*:

slice = [arr[i][0:2] for i in range(0,2)]
Run Code Online (Sandbox Code Playgroud)

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

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

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

*这实际上也适用于numpy数组,但与我上面发布的"原生"解决方案相比,它会很慢.

  • @AlexanderCska实际上并不奇怪.这两个表达式基本上是"取'a`的第一个元素并返回它的副本"和"复制`a`并返回副本的第一个元素".修复是`[x [0] for x in a],或者,如果你正在使用`numpy`,`a [:,0]` (3认同)
  • @mgilson 我厌倦了这个并得到了一些相当奇怪的结果。假设我有 `a=[[1,2,3],[4,5,6],[7,8,9]]` 然后 `a[0][:]=[1, 2, 3]`但奇怪的是 `a[:][0]` 仍然是 `[1,2,3]`。我想说这应该是“[1,4,7]”。如果您能告诉我这里出了什么问题,我将不胜感激。 (2认同)