切片3d numpy数组

时间:2015-01-18 14:35:21

标签: python numpy

请考虑以下事项:

A = np.zeros((2,3))
print(A)

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

这对我有意义。我告诉numpy做一个2x3矩阵,这就是我得到的。

但是,以下内容:

B = np.zeros((2, 3, 4))
print(B)

给我这个:

[[[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]

 [[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]]

这对我没有意义。 Aren我告诉numpy制作一个有4个2x3矩阵的立方体?我更加困惑,因为虽然数据结构看起来不正确,但切片的工作原理与计划完全相同:

print(B[:,:,1])

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

我错过了关于如何构建这些数组的内容,但我不确定是什么。有人可以解释我错过或不理解的内容吗?

非常感谢!

3 个答案:

答案 0 :(得分:14)

NumPy数组首先迭代最左边的轴。因此,如果B有形状 (2,3,4),然后B[0]具有形状(3,4),B[1]具有形状(3,4)。在这个意义上, 您可以将B视为2个形状数组(3,4)。你可以看看这两个 B的repr中的数组:

In [233]: B = np.arange(2*3*4).reshape((2,3,4))
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],       <-- first (3,4) array 
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],      <-- second (3,4) array 
        [20, 21, 22, 23]]])

您还可以通过首先迭代最后一个索引来将B视为包含四个2x3数组:

for i in range(4):
    print(B[:,:,i])

# [[ 0  4  8]
#  [12 16 20]]
# [[ 1  5  9]
#  [13 17 21]]
# [[ 2  6 10]
#  [14 18 22]]
# [[ 3  7 11]
#  [15 19 23]]

但您可以很容易地将B视为三个2x4数组:

for i in range(3):
    print(B[:,i,:])

# [[ 0  1  2  3]
#  [12 13 14 15]]
# [[ 4  5  6  7]
#  [16 17 18 19]]
# [[ 8  9 10 11]
#  [20 21 22 23]]

NumPy数组以这种方式非常灵活。但就repr的{​​{1}}而言,你看到的对应于两个(3x4)数组,因为B首先在最左边的轴上进行迭代

B

答案 1 :(得分:2)

B是3D矩阵。您指定的索引(2x3x4)正是打印出来的。最外面的括号有2个元素,中间括号有3个元素,最里面的括号有4个元素。

答案 2 :(得分:1)

我希望下面的示例可以阐明您问题的第二部分,当您键入print(B[:,:,1])

时,您询问要获取2X3矩阵的问题
import numpy as np
B = [[[1,2,3,4],
  [5,6,7,8],
  [9,10,11,12]],

 [[13,14,15,16],
  [17,18,19,20],
  [21,22,23,24]]]

B = np.array(B)
print(B)
print()
print(B[:,:,1])

[[[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]]

 [[13 14 15 16]
  [17 18 19 20]
  [21 22 23 24]]]

[[ 2  6 10]
 [14 18 22]]

由于B的维数为2X3X4,就B的3X4而言,这意味着您有两个大小为repr的矩阵

现在在B[:,:,1]中,我们将传递::1。首先:表示我们正在选择两个3X4矩阵。第二个:表示我们正在从两个3X4矩阵中选择所有行。第三个参数1表示我们仅从两个3X4矩阵中选择所有行的第二列值。因此我们得到

[[ 2  6 10]
 [14 18 22]]