在Numpy中切片后确定结果数组的形状

Kir*_*ran 6 python arrays numpy

我很难理解在切割成numpy后如何确定合成数组的形状.例如,我使用以下简单代码:

import numpy as np


array=np.arange(27).reshape(3,3,3)

slice1 = array[:,1:2,1]
slice2= array[:,1,1]

print "Content in slice1 is  ", slice1
print "Shape of slice1 is ", slice1.shape
print "Content in slice2 is ",slice2
print "Shape of Slice2 is", slice2.shape
Run Code Online (Sandbox Code Playgroud)

输出是:

Content in slice1 is 
 [[ 4]
  [13]
  [22]]
Shape of slice1 is  (3, 1)
Content in slice2 is  [ 4 13 22]
Shape of Slice2 is (3,)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,内容都是相同的(应该是这样).但它们的形状不同.那么,结果形状是如何由numpy决定的?

Ana*_*mar 6

它基本归结为此 -

In [118]: a = np.array([1,2,3,4,5])

In [119]: a[1:2]
Out[119]: array([2])

In [120]: a[1]
Out[120]: 2
Run Code Online (Sandbox Code Playgroud)

当你这样做时a[1:2],你要求的是一个包含1个元素的数组.

当你这样做时,a[1]你要求该索引处的元素.


在你的情况下发生类似的事情.

当你这样做时 - array[:,1:2,1]它意味着来自第一维的所有可能的索引,来自第二维的索引的子列表(尽管子列表仅包含一个元素),以及来自第三维的第一索引.所以你得到一个阵列数组 -

 [[ 4]
  [13]
  [22]]
Run Code Online (Sandbox Code Playgroud)

当你这样做时 - array[:,1,1]它表示所有可能的索引来自第一维,第一索引来自第二维,第一索引来自第三维.所以你得到一个阵列 -

[4 13 22]
Run Code Online (Sandbox Code Playgroud)