从Numpy的教程中,可以使用整数对轴进行索引,例如0
用于列,1
用于行,但是我不明白为什么用这种方式对它们进行索引?当处理多维数组时,如何计算每个轴的索引?
Answers:
根据定义,维的轴号是该维在数组内的索引shape
。它也是在索引编制过程中用于访问该尺寸的位置。
例如,如果2D数组的a
形状为(5,6),则a[0,0]
最多可以访问a[4,5]
。因此,轴0是第一维(“行”),轴1是第二维(“列”)。在较高的尺寸中,“行”和“列”实际上不再有意义,请尝试根据所涉及的形状和索引来考虑轴。
.sum(axis=n)
例如,如果这样做,n
则折叠并删除维度,新矩阵中的每个值都等于相应折叠值的总和。例如,如果b
具有shape (5,6,7,8)
,而您执行了c = b.sum(axis=2)
,则第2轴(尺寸为7的维度)将折叠,结果为shape (5,6,8)
。此外,c[x,y,z]
等于所有元素的总和b[x,y,:,z]
。
您可以通过以下方式掌握轴:
>>> a = np.array([[[1,2,3],[2,2,3]],[[2,4,5],[1,3,6]],[[1,2,4],[2,3,4]],[[1,2,4],[1,2,6]]])
array([[[1, 2, 3],
[2, 2, 3]],
[[2, 4, 5],
[1, 3, 6]],
[[1, 2, 4],
[2, 3, 4]],
[[1, 2, 4],
[1, 2, 6]]])
>>> a.shape
(4,2,3)
我创建了一个具有不同值的形状数组,(4,2,3)
以便您可以清楚地分辨出结构。不同的轴意味着不同的“层”。
即,axis = 0
索引shape的第一维(4,2,3)
。它引用第一个数组[]
。其中包含4个元素,因此其形状为4:
array[[1, 2, 3],
[2, 2, 3]],
array[[2, 4, 5],
[1, 3, 6]],
array[[1, 2, 4],
[2, 3, 4]],
array[[1, 2, 4],
[1, 2, 6]]
axis = 1
索引第二维的形状(4,2,3)
。有该层的每个阵列中2个元素:axis = 0
,EC在阵列
array[[1, 2, 3],
[2, 2, 3]]
。这两个元素是:
array[1, 2, 3]
array[2, 2, 3]
第三个形状值表示图层的每个数组元素中有3个元素:axis = 2
。ec中有3个元素array[1, 2, 3]
。那是明确的。
而且,您还可以从[]
开头或结尾的数量告诉轴/尺寸。在这种情况下,数量是3( [[[
),所以你可以选择axis
从axis = 0
,axis = 1
和axis = 2
。
通常,轴= 0,表示所有第一维的单元随第二维和第三维的值而变化,依此类推
例如,二维数组具有两个相应的轴:第一个垂直跨行垂直向下(轴0),第二个跨列水平向下(轴1)
对于3D,它变得很复杂,因此,请使用多个for循环
>>> x = np.array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> x.shape #(3, 3, 3)
#axis = 0
>>> for j in range(0, x.shape[1]):
for k in range(0, x.shape[2]):
print( "element = ", (j,k), " ", [ x[i,j,k] for i in range(0, x.shape[0]) ])
...
element = (0, 0) [0, 9, 18] #sum is 27
element = (0, 1) [1, 10, 19] #sum is 30
element = (0, 2) [2, 11, 20]
element = (1, 0) [3, 12, 21]
element = (1, 1) [4, 13, 22]
element = (1, 2) [5, 14, 23]
element = (2, 0) [6, 15, 24]
element = (2, 1) [7, 16, 25]
element = (2, 2) [8, 17, 26]
>>> x.sum(axis=0)
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
#axis = 1
for i in range(0, x.shape[0]):
for k in range(0, x.shape[2]):
print( "element = ", (i,k), " ", [ x[i,j,k] for j in range(0, x.shape[1]) ])
element = (0, 0) [0, 3, 6] #sum is 9
element = (0, 1) [1, 4, 7]
element = (0, 2) [2, 5, 8]
element = (1, 0) [9, 12, 15]
element = (1, 1) [10, 13, 16]
element = (1, 2) [11, 14, 17]
element = (2, 0) [18, 21, 24]
element = (2, 1) [19, 22, 25]
element = (2, 2) [20, 23, 26]
# for sum, axis is the first keyword, so we may omit it,
>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]]),
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]]),
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]]))
0
应该引用行,1
应该引用列。我怀疑你是想例如.sum(axis=0)
其总和沿行(生产塔总计)。