请考虑以下事项:
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.]]
我错过了关于如何构建这些数组的内容,但我不确定是什么。有人可以解释我错过或不理解的内容吗?
非常感谢!
答案 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])
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]]