python numpy库作用_Python数据分析工具库-Numpy 数组支持库(一)

1 Numpy数组

在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据进行快速处理的函数,Numpy中内置函数处理数据的速度是C语言级别的。Numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy中的ndarray类提供了python对多维数组对象的支持,并具备对矢量进行运算的能力,运算更为快速且节省空间。

ndarray是N维数组对象(矩阵),其中所有的元素都必须是相同类型。ndarray主要包含以下几个属性:

ndarray.ndim:表示数组对象或矩阵的维度;

ndarray.shape:表示每个维度上的数组的大小;

ndarray.size:表示数组中元素的总数,等同于ndarray.shape中两个元素的乘积;

ndarray.dtype:表示数组中元素的类型;

ndarray.itemsize:表示数组中每个元素的字节大小,比如数据类型为float64的数组,其元素的字节大小为64/8=8。

比如:

>>> import numpy as np

>>> a = np.arange(15).reshape(3, 5)

>>> a

array([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14]])

>>> a.shape

(3, 5)

>>> a.ndim

2

>>> a.dtype.name

'int64'

>>> a.itemsize

8

>>> a.size

15

>>> type(a)

2 创建Numpy数组

array方法

>>> import numpy as np

>>> a = np.array([2,3,4])#创建一维数组

>>> b = np.array([(1.5,2,3), (4,5,6)])#创建二维数组

>>> c = np.array( [ [1,2], [3,4] ], dtype=float64 )#创建指定数据类型的数组

如果想创建指定shape的数组,并使用占位符来初始化数组,可以用以下方法:

>>> np.zeros( (3,4) )#创建3行4列矩阵,用0初始化矩阵中所有的元素

array([[ 0., 0., 0., 0.],

[ 0., 0., 0., 0.],

[ 0., 0., 0., 0.]])

>>> np.ones( (2,3,4), dtype=np.int16 ) #创建三维矩阵,维度分别为2,3,4,且用1来初始化矩阵中所有的元素

array([[[ 1, 1, 1, 1],

[ 1, 1, 1, 1],

[ 1, 1, 1, 1]],

[[ 1, 1, 1, 1],

[ 1, 1, 1, 1],

[ 1, 1, 1, 1]]], dtype=int16)

>>> np.empty( (2,3) ) #创建2行3列空矩阵,矩阵中元素初始值随机,取决于内存状态,默认情况下,创建的数组的dtype为float64。

array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],

[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])

对应的zeros、ones、empty还有zeros_like、ones_like、empty_like,它们以另一个数组为参数,根据其形状和dtype创建数组。

arange方法,与Python内置的range相似:

>>> numpy.arange(6)

array([0,1,2,3,4,5,])

>>> np.arange( 10, 30, 5 )

array([10, 15, 20, 25])

3 数组基本数学操作

加、减、乘、点乘

>>> a = np.array( [20,30,40,50] )

>>> b = np.arange( 4 )

>>> b

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

>>> c = a-b

>>> c

array([20, 29, 38, 47])

>>> 10*np.sin(a)

array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])

>>> a<35

array([ True, True, False, False])

>>> A = np.array( [[1,1],

... [0,1]] )

>>> B = np.array( [[2,0],

... [3,4]] )

>>> A*B #矩阵相乘

array([[2, 0],

[0, 4]])

>>> A.dot(B) #矩阵点乘

array([[5, 4],

[3, 4]])

>>> np.dot(A, B) #矩阵点乘

array([[5, 4],

[3, 4]])

叠加、叠乘

>>> a = np.ones((2,3), dtype=int)

>>> b = np.random.random((2,3))

>>> a *= 3

>>> a

array([[3, 3, 3],

[3, 3, 3]])

>>> b += a

>>> b

array([[ 3.417022 , 3.72032449, 3.00011437],

[ 3.30233257, 3.14675589, 3.09233859]])

>>> a += b #浮点型不能转换成整型

TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

取最大、最小、求和

>>> a = np.random.random((2,3))

>>> a

array([[ 0.18626021, 0.34556073, 0.39676747],

[ 0.53881673, 0.41919451, 0.6852195 ]])

>>> a.sum()

2.5718191614547998

>>> a.min()

0.1862602113776709

>>> a.max()

0.6852195003967595

对于多维矩阵,只在其中指定轴进行操作,使用axis参数

>>> b = np.arange(12).reshape(3,4)

>>> b

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]])

>>> b.sum(axis=0) #对二维矩阵的列轴进行求和

array([12, 15, 18, 21])

>>> b.min(axis=1) #求二维矩阵的每个横轴最小值

array([0, 4, 8])

通用函数(ufunc),对ndarray中的数据执行元素级运算,比如sin、cos、exp等:

>>> B = np.arange(3)

>>> B

array([0, 1, 2])

>>> np.exp(B)

array([ 1. , 2.71828183, 7.3890561 ])

>>> np.sqrt(B)

array([ 0. , 1. , 1.41421356])

>>> C = np.array([2., -1., 4.])

>>> np.add(B, C)

array([ 2., 0., 6.])

4 数组的索引、切片和遍历

和Python的list数据结构类似,Numpy的一维数组也可以进行索引、切片以及遍历。

>>> a = np.arange(10)**3

>>> a

array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])

>>> a[2]

8

>>> a[2:5]

array([ 8, 27, 64])

>>> a[:6:2] = -1000 #从0-6的元素中,每隔2个将元素值重新赋值为-1000

>>> a

array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])

>>> for i in a:

... print(i + 1)

-999

2

-999

28

-999

126

217

344

513

730

二维数组的索引、切片:

>>> def f(x,y):

... return 10*x+y

...

>>> b = np.fromfunction(f,(5,4),dtype=int) #函数式创建数组,fromfunction第一个参数为函数f,第二个参数为数组的shape,shape第一个参数为函数f第一个参数的取值范围,第二个参数为函数f第二个参数的取值范围,dtype表示数组元素类型。

>>> b

array([[ 0, 1, 2, 3],

[10, 11, 12, 13],

[20, 21, 22, 23],

[30, 31, 32, 33],

[40, 41, 42, 43]])

>>> b[2,3] #不是数组b中的第2行第三列的元素,而是索引为[2,3]的元素

23

>>> b[0:5, 1] #取出从第0行到第5行的第2个元素组成数组

array([ 1, 11, 21, 31, 41])

>>> b[ : ,1] #等同于前一句

array([ 1, 11, 21, 31, 41])

>>> b[1:3, : ] #取出第2行与第3行的所有元素组成数组

array([[10, 11, 12, 13],

[20, 21, 22, 23]])

>>> for row in b: #遍历得到b数组的每一行元素

... print(row)

...

[0 1 2 3]

[10 11 12 13]

[20 21 22 23]

[30 31 32 33]

[40 41 42 43]

>>> for element in b.flat: #遍历得到b数组的每一个元素

... print(element)

...

0

1

2

3

10

11

12

13

20

21

22

23

30

31

32

33

40

41

42

43

多维数组的索引、切片:

>>> c = np.array( [[[ 0, 1, 2],

... [ 10, 12, 13]],

... [[100,101,102],

... [110,112,113]]])

>>> c.shape

(2, 2, 3)

>>> c[1,…] #等同于 c[1,:,:] or c[1]

array([[100, 101, 102],

[110, 112, 113]])

>>> c[...,2] #等同于 c[:,:,2]

array([[ 2, 13],

[102, 113]])

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值