Python数据分析-Numpy数值计算
Numpy介绍:
NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。
NumPy提供了两种基本对象:ndarray 和 ufunc。其余的对象都是以这两种对象为基础(如矩阵)。
NumPy的主要功能:
1)ndarray,一个多维数组结构,高效且节省空间
2)无需循环对整组数据进行快速运算的数学函数
3)读写磁盘数据的工具以及用于操作内存映射文件的工具
4)线性代数、随机数生成和傅里叶变换功能
5)用于集成C、C++等代码的工具
pyhton里面安装、引入方式:
安装方法(在 命令行方式执行):pip install numpy
引用方式:import numpy as np
## numpy示例py01
import numpy as np
a=np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
for i in a:
print(i,end=',')
print()
##输出结果: 0,1,2,3,4,5,6,7,8,9,
b=list(range(10))
print(b)
##输出结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
import sys
sys.getsizeof(b)
print(sys.getsizeof(b))
a=np.array(range(10))
sys.getsizeof(a)
print(a)
print(sys.getsizeof(a))
##可以看出,原生的列表占用内存更大,
##而ndarray类型占用的小是因为numpy内部使用c++实现的复制代码
# 示例
import sys
a = [1, 2]
b = [a, a] # 即 [[1, 2], [1, 2]]
print(a)
print(b)
# a、b 都只有两个元素,所以直接占用的大小相等
print(sys.getsizeof(a)) # 结果:80 或 36
print(sys.getsizeof(b)) # 结果:80 或 36
## numpy示例py02
#计算购物车里的商品的总和,有单价和商品数量
import random
#单价
prize=[round(random.uniform(10.0,20.0),2) for i in range(10)]
#随机产生示例数据 【10.0,20.0】的单价prize:16.56, 19.02, 12.33, 13.62, 14.85, 18.77, 15.65, 17.68, 13.01, 11.61]
#数量
num=[round(random.uniform(1,10)) for i in range(10)]
#随机产生示例数据 【1,10】的数量num: [4, 9, 4, 3, 6, 1, 6, 9, 9, 2]
#两个列表里的商品和数量是对应的,现在求和
#传统的方式,写个循环
def ceshi(a,b):
sum=0
for i,j in zip(prize,num):
sum+=i*j
return sum
print('购物车里的商品的金额总和:',ceshi(prize,num))
#输出结果 购物车里的商品的金额总和 828.8000000000001
import timeit
# %timeit ceshi(prize,num)
'''2.1 µs ± 193 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
大概用时2-3微秒
'''
import numpy as np
# 使用ndarray计算
#先转换成ndarray
prize_np=np.array(prize)
'''prize_np
array([ 16.56, 19.02, 12.33, 13.62, 14.85, 18.77, 15.65, 17.68,13.01, 11.61])
'''
num_np=np.array(num)
### num_np array([4, 9, 4, 3, 6, 1, 6, 9, 9, 2])
#点乘
np.dot(prize_np,num_np)
#输出结果 828.80000000000007
#看时间上的消耗
# %timeit np.dot(prize_np,num_np)
#1.07 µs ± 20 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
# 如果数据量大的话,ndarray在时间上的优势会更明显
#上边的写法还有很多
print(sum(prize_np*num_np))
#array([ 66.24, 171.18, 49.32, 40.86, 89.1 , 18.77, 93.9 ,
# 159.12, 117.09, 23.22])
#相乘,就是对应位置上的数据做乘法
#再进行求和操作
print(prize_np*2)
# array([ 33.12, 38.04, 24.66, 27.24, 29.7 , 37.54, 31.3 , 35.36,26.02, 23.22])
print(prize_np+100)
# array([ 116.56, 119.02, 112.33, 113.62, 114.85, 118.77, 115.65,117.68, 113.01, 111.61])
print(prize_np/2)
#array([ 8.28 , 9.51 , 6.165, 6.81 , 7.425, 9.385, 7.825, 8.84 ,6.505, 5.805])
print(prize_np**2)
#array([ 274.2336, 361.7604, 152.0289, 185.5044, 220.5225, 352.3129,244.9225, 312.5824, 169.2601, 134.7921])
#取商
print(prize_np//2)
# array([ 8., 9., 6., 6., 7., 9., 7., 8., 6., 5.])
#取实际的除法元算结果
print(prize_np/2)
#array([ 8.28 , 9.51 , 6.165, 6.81 , 7.425, 9.385, 7.825, 8.84 ,6.505, 5.805])
print(prize_np**prize_np)
# array([ 1.54041985e+20, 2.14083871e+24, 2.82862082e+13,2.80215533e+15, 2.51268378e+17, 7.99695030e+23,4.94480820e+18, 1.13628263e+22, 3.13868425e+14,2.30516529e+12])
#ndarray 数组里的类型必须一致,一般大多数时候存储的是科学计算类型(整数和小数),字符串放里边其实也不快,不如用列表
## numpy示例py03
import numpy as np
import random
prize=[round(random.uniform(10.0,20.0),2) for i in range(10)]
prize_np=np.array(prize)
#查看数据类型
print('数据类型',prize_np.dtype)
## 输出 float64 看出这是一个64位(4字节)的浮点类型
a=np.arange(100)
'''a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
'''
print('数据类型',a.dtype)
# 输出 int32
#说明该类型是32位的int类型
# 获取长度
print('数组长度',a.size)
#输出 100
#取数组的纬度,返回的是元组,多维数组就可以看到效果
print('数组的纬度',a.shape)
#(100,)
b=np.array([[5,4,23],[1,6,23]])
print('数组:\n',b)
#b array([[5, 4, 23],[1, 6, 23]])
print('数组的纬度',b.shape)
# (2, 3) 两行三列
# 返回维度值
print('a 的维度值',a.ndim)
# 1维
print('b 的维度值',b.ndim)
# 2维
# 数组的转置(倒置),将行变列,列变行
print('数组的转置(倒置)\n',b.T)
# array([[ 5, 1],[ 4, 6],[23, 23]])
## numpy示例py04
import numpy as np
import random
## 转换数据类型,nbarray本身只能存储一种数据类型,压迫转换的,需要astype
# 将b里的数转换为小数
b=([[ 3, 4, 23],[ 1, 6, 23]])
b=np.array(b)
b[0][0]=3.2
print(b.dtype)
print(b)
#array([[ 3, 4, 23],[ 1, 6, 23]])
# 转换之后,会自动取为整数,不是我们要的效果
#通过修改数据类型
b.dtype="float32"
print(b.dtype)
# dtype('float32')
print(b)
# array([[ 4.20389539e-45, 5.60519386e-45, 3.22298647e-44],[ 1.40129846e-45, 8.40779079e-45, 3.22298647e-44]], dtype=float32)
# 虽然类型修改成功,但是值发生了变化,因为在计算机里存储的二进制形式整数和小数是不一样的,这么暴力的转换是不行的
b.dtype='int32'
print(b)
#array([[ 3, 4, 23],[ 1, 6, 23]])
# 用astype,记住这里是有返回值的,并没有改变原有的数据
c=b.astype("float32")
print(c)
# array([[ 3., 4., 23.],[ 1., 6., 23.]], dtype=float32)
c[0][0]=3.2
print(c)
# array([[ 3.20000005, 4. , 23. ],
# [ 1. , 6. , 23. ]], dtype=float32)
# 可以看出转换成功(3.20000005,这里是32位的精度的问题,如果改为float64,精度就非常高,就没有0000005)
c=b.astype("float64")
print(c)
#array([[ 3., 4., 23.],[ 1., 6., 23.]])
c[0][0]=3.2
print(c)
#array([[ 3.2, 4. , 23. ],[ 1. , 6. , 23. ]])
#将列表转换为数组,可选择显式指定dtype
# 列表类型转ndarray
a=list(range(10))
a=np.array(a,dtype="float")
#会自动匹配float32或者64位
print(a)
# array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
print( a.dtype )
# dtype('float64')