从Numpy's tutorial开始,轴可以用整数索引,比如0是列,1是行,但是我不明白为什么要用这种方式索引它们?当处理多维数组时,我如何计算出每个轴的索引?
0
1
tzdcorbm1#
根据定义,维度的轴编号是该维度在数组shape中的索引,也是索引期间用来存取该维度的位置。例如,如果二维数组a的形状为(5,6),则可以访问a[0,0]直到a[4,5]。因此,轴0是第一维(“行”),轴1是第二维(“列”)。在更高的维中,“行”和“列”不再有意义,请尝试根据所涉及的形状和索引来考虑轴。例如,如果您执行.sum(axis=n),则维度n会折迭并删除,新矩阵中的每个值相等Map折迭值的总和。例如,如果b的形体为(5,6,7,8),而您执行c = b.sum(axis=2),则轴2(尺寸为7的维度),结果的形状为(5,6,8)。此外,c[x,y,z]等于所有元素b[x,y,:,z]的总和。
shape
a
a[0,0]
a[4,5]
.sum(axis=n)
n
b
(5,6,7,8)
c = b.sum(axis=2)
(5,6,8)
c[x,y,z]
b[x,y,:,z]
tzcvj98z2#
如果有人需要shape=(3,5)数组的以下直观描述:
shape=(3,5)
gk7wooem3#
您可以通过以下方式抓取轴:
>>> 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索引(4,2,3)形体的第一维。它会指涉第一个[]中的数组。其中有4个元素,所以它的形体是4:
(4,2,3)
axis = 0
[]
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,例如在数组中
axis = 1
array[[1, 2, 3], [2, 2, 3]]
。这两个元素是:
array[1, 2, 3] array[2, 2, 3]
第三个形状值表示层的每个阵元中有3个元素:axis = 2. e.c.在array[1, 2, 3]中有3个元素。这是显式的。另外,你可以从开头或结尾的[]的数字来判断轴/尺寸。在这种情况下,数字是3([[[),所以你可以从axis = 0、axis = 1和axis = 2中选择axis。
axis = 2
array[1, 2, 3]
[[[
axis
y1aodyip4#
通常,轴= 0表示第一维随第二维和第三维的每个值变化的所有像元,依此类推例如,二维数组有两个Map的轴:第一个垂直向下跨行(轴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]]))
4条答案
按热度按时间tzdcorbm1#
根据定义,维度的轴编号是该维度在数组
shape
中的索引,也是索引期间用来存取该维度的位置。例如,如果二维数组
a
的形状为(5,6),则可以访问a[0,0]
直到a[4,5]
。因此,轴0是第一维(“行”),轴1是第二维(“列”)。在更高的维中,“行”和“列”不再有意义,请尝试根据所涉及的形状和索引来考虑轴。例如,如果您执行
.sum(axis=n)
,则维度n
会折迭并删除,新矩阵中的每个值相等Map折迭值的总和。例如,如果b
的形体为(5,6,7,8)
,而您执行c = b.sum(axis=2)
,则轴2(尺寸为7的维度),结果的形状为(5,6,8)
。此外,c[x,y,z]
等于所有元素b[x,y,:,z]
的总和。tzcvj98z2#
如果有人需要
shape=(3,5)
数组的以下直观描述:gk7wooem3#
您可以通过以下方式抓取轴:
我用不同的值
(4,2,3)
创建了一个形状数组,这样你就可以清楚地知道结构。不同的轴意味着不同的“层”。也就是说,
axis = 0
索引(4,2,3)
形体的第一维。它会指涉第一个[]
中的数组。其中有4个元素,所以它的形体是4:axis = 1
为(4,2,3)
形状中的第二维度编制索引。该层的每个数组中有2个元素:axis = 0
,例如在数组中。这两个元素是:
第三个形状值表示层的每个阵元中有3个元素:
axis = 2
. e.c.在array[1, 2, 3]
中有3个元素。这是显式的。另外,你可以从开头或结尾的
[]
的数字来判断轴/尺寸。在这种情况下,数字是3([[[
),所以你可以从axis = 0
、axis = 1
和axis = 2
中选择axis
。y1aodyip4#
通常,轴= 0表示第一维随第二维和第三维的每个值变化的所有像元,依此类推
例如,二维数组有两个Map的轴:第一个垂直向下跨行(轴0),第二个水平跨列(轴1)
对于3D,它变得复杂,因此,使用多个for循环