oceansK

导航

学习笔记-004

NumPy介绍

NumPy数组存储在一个均匀连续的内存块中,而Python的list元素分散存储在系统内存中;NumPy会利用现代CPU的矢量化指令计算,加载寄存器中的多个连续浮点数,而且NumPy中的矢量计算可以采取多线程方式,充分利用多核CPU计算资源,大大提升了计算效率。另外,可采取就地操作方式而非采用隐式拷贝来提升内存和计算资源的利用率。
NumPy中有两个重要的对象:ndarray(N-dimensional array object)解决了多维数组问题,而ufunc(universal function object)是解决对数组进行处理的函数。

ndarray对象
ndarray实际上是多维数组的含义,在NumPy数组中,维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,依此类推。在NumPy中,每一个线性的数组称为一个轴(axes),秩就是描述轴的数量。
利用ndarray对象创建数组,以及处理结构数组;
创建数组

import numpy as np
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b[1, 1] = 10
print(a.shape, b.shape, a.dtype)
print(b)

运行结果

(3,) (3, 3) int64
[[ 1  2  3]
 [ 4 10  6]
 [ 7  8  9]]

在创建数组前,需要引用NumPy库,然后通过array函数创建数组;如果是多维数组,可以先把一个数组作为一个元素,然后嵌套起来,即数组的中元素也是数组,如示例中数组b的三个元素[1,2,3],[4,5,6],[7,8,9]都是数组。
数组的属性,shape函数可以获得数组的大小,dtype函数可以获得元素的属性。可以对数组元素中的数值直接赋值来进行修改,元素的位置索引是从0开始。

结构数组
即常见的结构表形式的数组,如下形式:

import numpy as np
stu_types = np.dtype({'names':['name', 'age', 'chinese', 'math', 'english'], 'formats':['S32', 'i', 'i', 'i', 'f']})
students = np.array([('ZhangSan', 17, 77, 88, 90), ('LiSi', 18, 80, 90, 85), ('WangWu', 17, 85, 80, 90), ('DengLiu', 18, 75, 70, 90)], dtype=stu_types)
ages = students[:]['age']
chineses = students[:]['chinese']
maths = students[:]['math']
englishs = students[:]['english']
print(np.mean(ages), np.mean(chineses), np.mean(maths), np.mean(englishs))

运行结果
17.5 79.25 82.0 88.75
首先利用NumPy中的dtype定义了结构类型,然后在定义数组时在array中利用dtype=stu_types指定了结构数组元素的类型;

ufunc运算
ufunc即universal function,可以对数组中的每个元素进行函数操作,NumPy中很多ufunc函数计算速度非常快,原因是使用C语言实现的。

连续数组的创建
NumPy可以很方便地创建连续数组,如下为使用arange或linspace函数创建连续数组:

r1 = np.arange(1, 21, 4)
r2 = np.linspace(1, 17, 5)

np.arange和np.linspace的起到的作用是一样的,都是创建等差数组,这两个数组的结果分别是array([ 1, 5, 9, 13, 17])和array([ 1., 5., 9., 13., 17.]),可以看到是同样的数组但元素的数值类型不同dtype('float64'),dtype('float64')。
arange()通过指定初始值、终值、步长来创建等差数列的一维数组,默认不包括终值;linspace是linear space的缩写,代表线性等分向量的含义,linspace()通过指定初始值、终值、元素个数来创建等差数列的一维数组,默认包括终值。

算术运算
可以通过NumPy进行加减乘除、求n次方和取余数操作。
利用上述示例的两个数组r1和r2,求两个数组的加减乘除、求n次方和取余数。在n次方中,r2数组中的元素是次方的次数,r1数组的元素为次方的基数。取余数操作,可以使用np.mod(r1,r2),也可以使用np.remainder(r1,r2)。

print(np.add(r1, r2))
print(np.subtract(r1, r2))
print(np.multiply(r1,r2))
print(np.divide(r1, r2))
print(np.power(r1, r2))
print(mod(r1,r2))

运行结果

[ 2. 10. 18. 26. 34.]
[0. 0. 0. 0. 0.]
[  1.  25.  81. 169. 289.]
[1. 1. 1. 1. 1.]
[1.00000000e+00 3.12500000e+03 3.87420489e+08 3.02875107e+14
 8.27240262e+20]
[0. 0. 0. 0. 0.]

统计函数
对一份数据进行描述性统计分析,可以帮助对数据有更清晰的认识,如了解这些数据中的最大值、最小值、平均值、方差、标准差,是否符合正态分布等,可以在NumPy中使用这些统计函数来实现;
求数组\矩阵中的最大值函数amax()、最小值函数amin()

import numpy as np
a = np.arange([[1,2,3], [4,5,6], [7,8,9]])
print(np.amin(a), np.amin(a,0), np.amin(a,1))
print(np.amax(a), np.amax(a,0), np.amax(a,1))

运行结果
1 [1 2 3] [1 4 7]
9 [7 8 9] [3 6 9]
amin()用于计算数组中的元素沿指定轴的最小值,对于一个二维数组a,amin(a)计算的是数组中全部元素的最小值,amin(a,0)计算的是沿着axis=0轴元素的最小值,axis=0轴是把元素看成[1,4,7],[2,5,8],[3,6,9]三个元素,所以最小值是[1,2,3];amin(a,1)是沿着axis=1轴的最小值,axis=1轴是把元素看成[1,2,3], [4,5,6], [7,8,9]三个元素,所以最小值是[1,4,7]。同理amax()是计算数组中元素沿指定轴的最大值。

计算最大值与最小值之差ptp()
对于相同的数组a,np.ptp(a)可以计算数组a中最大值与最小值的差。ptp(a,0)计算的是沿着axis=0轴的最大值与最小值的差,ptp(a,1)计算的是沿着axis=1轴计算的是沿着axis=1轴的最大值与最小值的差。

print(np.ptp(a), np.ptp(a,0), np.ptp(a,1))

运行结果
8 [6 6 6] [2 2 2]

计算数组中的百分位数percentile()
percentile(i)计算的是第i个百分位数,这里的i的取值范围是0-100,如果i=0,那么就是计算最小值,如果i=50就是计算平均值,如果i=100就是计算最大值,同样,可以计算沿axis=0和axis=1轴的i%的百分位数。

print(np.percentile(a, 50), np.percentile(a, 50, axis=0), np.percentile(a, 50, 1))

运行结果
5.0 [4. 5. 6.] [2. 5. 8.]

计算数组中的中位数median()、平均数mean()
可以使用median()和mean()函数计算数组中的中位数、平均值,同样可以沿着axis=0, axis=1轴来计算。

print(np.median(a), np.median(a, axis=0), np.median(a, 1))
print(np.mean(a), np.mean(a, axis=0), np.mean(a, 1))

运行结果
5.0 [4. 5. 6.] [2. 5. 8.]
5.0 [4. 5. 6.] [2. 5. 8.]

计算数组中的加权平均值average()
average()函数可以计算加权平均值,加权平均就是每个元素可以设置权重,默认情况下每个元素的权重是相同的,也可以指定权重数组wts,这样来计算加权平均np.average(a, weights=wts)

a = np.array([1,2,3,4])
wts = np.array([1,2,3,4])
print(np.average(a), np.average(a, weights=wts))

运行结果
2.5 3.0

计算数组中的标准差std()、方差var()
方差是指每个数值与平均值之差的平方和的平均值,即mean((x-x.mean())**2),标准差是方差的算术平方根,代表的是一组数据离平均值的分散程度。

a = np.array([1,2,3,4])
print(np.std(a), np.var(a))

运行结果
1.118033988749895 1.25

NumPy排序
在NumPy中可以使用sort函数来进行排序,sort(a, axis=-1, kind='quicksort', order=None),默认使用的快速排序,在kind中,可以指定quicksort、mergesort、heapsort分别代表快速排序、合并排序、堆排序;同样axis默认是-1,即沿着数组的最后一个轴进行排序,也可以指定不同的轴,或者axis=None代表采用扁平化的方式作为一个向量进行排序;order参数,对于结构化数组可以指定按照某个字段进行排序。

a = np.array([[4,3,2],[2,4,1]])
print(np.sort(a), '\n', np.sort(a, axis=None), '\n', np.sort(a, axis=0), '\n', np.sort(a, 1))

运行结果
[[2 3 4]
[1 2 4]]
[1 2 2 3 4 4]
[[2 3 1]
[4 4 2]]
[[2 3 4]
[1 2 4]]

练习:
小组中有5名成员,对应的成绩如下表所示,利用NumPy统计这些人在语文、英语、数学中的平均成绩、最低成绩、最高成绩、方差、标准差,然后按总成绩排序,得出名次并进行成绩输出;

name chinese english math
A 68 86 70
B 98 89 98
C 92 92 97
D 90 86 70
E 80 90 90
import numpy as np

stty = np.dtype({'names':['name','chinese', 'english', 'math'],'formats':['S32','i','i','i']})
st = np.array([('A',68,86,70), ('B',98,89,98), ('C',92,92,97), ('D',90,86,70), ('E',80,80,90)],dtype=stty)
print(st)
print(np.mean(st[:]['chinese']), np.mean(st[:]['english']), np.mean(st[:]['math']))
print(np.amin(st[:]['chinese']), np.amin(st[:]['english']), np.amin(st[:]['math']))
print(np.amax(st[:]['chinese']), np.amax(st[:]['english']), np.amax(st[:]['math']))
print(np.var(st[:]['chinese']), np.var(st[:]['english']), np.var(st[:]['math']))
print(np.std(st[:]['chinese']), np.std(st[:]['english']), np.std(st[:]['math']))

st['total']=st

posted on 2024-04-16 16:21  森洋  阅读(72)  评论(0)    收藏  举报