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,)
表示一维数组,1行3列,打印的shape为(3,)。
再看:
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)。
再看:
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]
为什么得到这样的结果呢?从纵轴上看,然后每个元素相加即可得结果中的每个元素(0+4+8+12+16+20=60)
print(a.sum(axis=1))
[ 6 22 38 54 70 86] #横轴上相加
那对于一维数组呢?
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
axis=0又表示横轴。这个上面的二维数组出现矛盾,显然,这种看法还是存在瞎蒙的成分。那三维数组,四维数组呢??
带着这些疑问,自己进行很多尝试,得到一些结论。
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)
****************************************************************************************************
axis=0时,是+,即,块的对应位置相加,shape=(3,4),没有2;
axis=1时,[ 0 1 2 3]+[ 4 5 6 7]+ [ 8 9 10 11] = [12 15 18 21],[12 13 14 15]+[16 17 18 19]+[20 21 22 23] = [48 51 54 57],先分成两块,每块的行对应位置相加,shape=(2,4),没有3;
由此,可以推断axis=2时,是先分成两块,每块分成3行,对于每行的每列相加,shape=(2,3),没有4。
因此,我们可以简单的得出结论,如果把n维数组看作n-1层嵌套,最外层是第0层。那么axis从0增加到n-1,对应着原始数组按照从外到内分成相应的组数,axis=l(l=0,1,..,l,...,n-1)就是第l层的组之间相加。举例:如果是三维数组,axis=1,就是第1层的组(先进行第0层分组,然后进行第1层分组,即块中的行)相加。还是有点绕,,,,,希望有明白人能说清楚吧,我说不清了,应该是理解了。