Numpy

Numpy库介绍:

Numpy是一个功能强大的python库,主要用于对多维数组执行计算。Numpy这个词来源于两个单词–Numerical和Python。Numpy提供了大量的库函数和操作,可以帮助程序员轻松进行数值计算,在数据分析和机器学习领域广泛使用,它有以下几个特点:

  1. numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动并行计算。
  2. numpy底层使用c语言编写,内部解除了GIL(全局解释锁)其对数组的操作速度不受python解释器的限制,效率远高于纯python代码
  3. 有一个强大的N维数组对象Array(一种类似于列表的东西)
  4. 实用的线性代数,傅里叶变换和随机生成函数
    总而言之,它是一个非常高效的用于处理数值型运算的包

安装:

pip install numpy  # 使用anaconda不需要安装

Numpy数组和Python列表的性能对比

# python列表的方式
t1 = time.time()
a = []
for x in range(100000):
    a.append(x**2)
t2 = time.time()
t = t2-t1
print(t)  # 0.11802864074707031

# numpy数组的方式
t3 = time.time()
b = np.arange(100000)**2
t4 = time.time()
print(t4-t3)  # 0.0029997825622558594

Numpy中的数组:

numpy中的数组的使用跟python中的列表非常类似,他们之间的区别如下:

  1. 一个列表中可以存放多种数据类型,比如a = [1,‘a’]是允许的,而数组只能存放同种数据类型
  2. 数组可以是多维的,当多维数组中所有的数据都是数值类型的时候,相当于线性代数中的矩阵,是可以相互进行运算的。

创建数组(np.ndarray对象):

Numpy经常和数组打交道,因此首先第一步要学会创建数组,在Numpy中的数组的数据类型叫ndarray,两种创建方式如下:

  1. 根据python中的列表生成:
import numpu as np
a1 = np.array([1,2,3,4])
print(a1)
print(type(a1))
  1. 使用np.arange()生成,np.arange的用法类似于python中的range
import numpy as np
a2 = np.arange(2,21,2)
print(a2)
  1. 使用np.random生成随机数的数组:
a1 = np.random。random((3,3))  # 生成3行3列的随机数的数组
a2 = np.random.randint(0,10,size=(3,3))  # 元素是从0-10之间随机的3行3列的数组
  1. 使用函数生成特殊的数组:
import numpy as np
a1 = np.zeros((2,2)) # 生成一个所有元素都是0的2行2列的数组
a2 = np.ones((3,2)) # 生成一个所有元素都是1的3行2列的数组
a3 = np.full((2,2),8) # 生成一个所有元素都是8的2行2列的数组
a4 = np.eye(3) # 生成一个在斜方向上元素为1,其它元素都为0的3行3列的数组(主对角线)
# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None),retstep为True时会显示间距
a5 = np.linspace(0,50,11,dtype='i',retstep=True) # 生成等差数组
# np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)base表示以10为底的对数
# start=base**start,stop=base**base,num表示生成的个数
# numpy.empty(shape, dtype = float, order = 'C')创建指定维数的数组
# numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,dtype表示数据类型,order表示在行方向上还是列方向上,C表示行F表示列

ndarray的数据类型:

数据类型

唯一标识符

布尔型

‘b’

整型(有符号)

‘i’

浮点型

‘f’

无符号整型

‘u’

时间间隔

‘m’

日期时间

‘M’

python(对象)

‘O’

字符串(字节)

‘S’或者’S20’,a

自定义数据类型:相当于C语言的结构体

student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
print(a)

修改数据类型:

import numpy as np
a1 =np.array([1,2])
print(a1.dtype) # windows系统下默认是int32
# 修改dtype属性
a2 = a1.astype(np.int64) #astype不会修改数组本身,而是将修改后的结果返回
print(a2.dtype)

ndarray数组属性:

  1. ndarray.ndim:数组的维度
a1 = np.array([1,2,3])
print(a1.ndim) # 维度为1
a2 = np.random.randint(0,10,(3,4))
print(a2.ndim) # 维度为2
a3 = np.array([[[1,2,3],[4,5,6]]])
print(a3.ndim)
  1. ndarray.shape:数组维度的元组
a1 = np.array([1,3,2])
print(a1.shape) # 输出(3,)意思是一维数组,有3个数据

a2 = np.array([[1,2,3],[4,5,6]])
print(a2.shape) # 输出(2,3)意思是二维数组,2行3列,也可以理解为2个一维数组,每个维度有3个数据

a3 = np.array([[[1,2,3],[4,5,6]],[[1,8,3],[4,9,6]]])
print(a3.shape) # 输出(2,2,3)表示3维数组
# shape返回的元组有几个元素就代表几维数组
  1. ndarray.size:求出数组元素的总个数
  2. ndarray.itemsize:数组中每个元素所占的字节数
  3. ndarray.reshape:可以修改数组的形状,条件只有一个,就是修改后的形状的元素的个数必须和原来的个数一致。并且不会影响原数组的形状。

ndarray切片和索引:

  1. 使用:号进行切片,它和python中的切片类似
import numpy as np
a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
# 也可以a[2:7:2]
print (a[s])
  1. 切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素