python数据分析与展示扩展——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,)

表示一维数组,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时,是\begin{array}{l} \left[\left[\begin{array}{llll} 0 & 1 & 2 & 3 \end{array}\right]\right. \\ \left[\begin{array}{llll} 4 & 5 & 6 & 7 \end{array}\right] \\ \left.\left[\begin{array}{llll} 8 & 9 & 10 & 11 \end{array}\right]\right] \end{array}+\begin{aligned} &\left[\left[\begin{array}{llll} 12 & 13 & 14 & 15 \end{array}\right]\right.\\ &\left[\begin{array}{llll} 16 & 17 & 18 & 19 \end{array}\right]\\ &[20212223]] \end{aligned},即,块的对应位置相加,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层分组,即块中的行)相加。还是有点绕,,,,,希望有明白人能说清楚吧,我说不清了,应该是理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值