numpy中的数据维度、轴、数据类型

dtype:数据类型

numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。

shape:数组形状

import numpy as np
t0 = np.array([1,2,3])
print(t0)
print(t0.shape)

输出:

[1 2 3]
(3,)

表示一维数组,打印的shape为(3,)。所有的一位数组都是这样表示的,shape第一个数字表示个数

再看:

t1 = np.arange(12)
t2 = t1.reshape(3,4)
print(t2)
print(t2.shape)

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(3, 4) 

二维数组,3行4列,打印的shape为(3,4)

t3 = np.arange(24).reshape(2,3,4)
print(t3)
print(t3.shape)

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

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
(2, 3, 4)

三维数组,2块(我个人的说法)3行4列,打印的shape为(2,3,4)。 

从上面可以看出,数组的维度与shape里面的元素个数有关,有n个就是n维。一维数组中shape[0]=c表示有c列,二维的shape[1]=c代表有c列,三维的shape[2]=c表示有c列。这样下去,可以得到shape的最后一个数值表示列依次从右到左表示为列、行、块(自己取的名字)......。即,n维数组的列数维shape[n-1]=c。怕有人可能有疑问,那为什么一维数组里面表示为(c,)呢?这是因为如果表示为(c),那么(c)=c,即是一个数字,然后shape本身用一个元组表示,所以表示为(c,),实际上(c,)也可以表示为(1,c),但是(1,c)又表示二维数组,故用(c,)表示。

再看:

t13 = np.array([[1],
                [2],
                [3]
                ])
print(t13)
print(t13.shape)

[[1]
 [2]
 [3]]
(3, 1) 

或者

import numpy as np
t0 = np.array([1,2,3])
t12 = t0.reshape(-1,1) #转化为列向量
print(t12)
print(t12.shape)

[[1]
 [2]
 [3]]
(3, 1) 

上述列向量同样验证了之前的说法。 

数组的加减乘除需满足广播法则,大致可以理解为对应位置相乘(以乘法举例)。shape为(3,2)、(3,2)的数组可以相乘,(3,3,2)和(3,2)可以相乘,(3,3,2)和(2,)可以相乘,即存在从右边起对应位置的数字相同(有几个相同不管,右边数第二个相同,第一个不同,不能做相应运算,以此内推)就可以进行四则运算。

axis:轴

一维数组时axis=0,二维数组时axis=0,1,维数越高,则axis可取的值越大,数组n维时,axis=0,1,…,n-1。对于轴,是很难理解的,不可以简单的理解为行和列,轴原意坐标轴,即方向。

对于二维数组,axis=0表示在第一个轴变化,即行轴,axis=1表示第二个轴变化,即列轴。对于二维数组:

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

print(a.sum(axis = 0))

[60 66 72 78]  #(6,4) ---->(?,4),,?表示变化的那一根轴。行轴发生变化,显然这里变为(1,4)------->(4,)

为什么得到这样的结果呢?从横轴上看,每个横轴的每个元素对应相加,即可得结果中的每个元素(0+4+8+12+16+20=60) 

print(a.sum(axis=1))

[ 6 22 38 54 70 86]  #(6,4)----->(6,?)------(6,1)------->(6,)

那对于一维数组呢?

import numpy as np
t0 = np.array([1,2,3])
print(t0)
print(t0.shape)
print("*"*100)
print(t0.sum(axis=0))

[1 2 3]
(3,)
****************************************************************************************************
6  #(3,)----->(?,)------>(1,)------->() 表示零维,即一个数字

带着这些疑问,自己进行很多尝试,得到一些结论。

import numpy as np
t0 = np.arange(24).reshape(2,3,4)
print(t0)
print(t0.shape)
print("*"*100)

t1=t0.sum(axis=0)
print(t1)
print(t1.shape)
print("*"*100)

t2=t0.sum(axis=1)
print(t2)
print(t2.shape)
print("*"*100)

t3=t0.sum(axis=2)
print(t3)
print(t3.shape)
print("*"*100)

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

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
(2, 3, 4)
****************************************************************************************************
[[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]]
(3, 4)
****************************************************************************************************
[[12 15 18 21]
 [48 51 54 57]]
(2, 4)
****************************************************************************************************
[[ 6 22 38]
 [54 70 86]]
(2, 3)
****************************************************************************************************

因此,我们可以简单的得出结论,如果把n维数组看作n-1层嵌套,最外层是第0层。那么axis从0增加到n-1,对应着原始数组按照从外到内分成相应的组数,axis=l(l=0,1,..,l,...,n-1)就是第l层的组之间相加。举例:如果是三维数组,axis=1,就是第1层的组(先进行第0层分组,然后进行第1层分组,即块中的行)相加。还是有点绕,,,,,

只需记住,axis=l,表示shape中第l个的数字要改变,也就是在l轴的方向上维度要做一些改动。

猜你喜欢

转载自blog.csdn.net/Frank_LJiang/article/details/104632316
今日推荐