Numpy数据处理

Numpy数据处理

Numpy基础

Numpy功能

  1. ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
  2. 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
  3. 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
  4. 线性代数、随机数生成以及傅里叶变换功能。
  5. 用于集成由C、C++、Fortran等语言编写的代码的C API

ndarray属性

符号属性
shape维度
dtype元素类型
size元素数量
ndim维数(轴),len(shape)
itemsize元素字节数
nbytes总字节数 = size × itemsize
real复数数组的实部数组
imag复数数组的虚部数组
T数组对象的转置视图
flat扁平迭代器

numpy的数据类型

类型写法
int8/int16/int32/int64i1、i2、i4、i8
uint8/uint16/uint32/uint64u1、u2、u4、u8
float16/float32/float64/float128f2、f4(f)、f8(d)、f16(g)
complex64/complex128/complex256c8、c16、c32
bool?
objectO
stringS
unicode_U

代码解读

创建ndarray对象

import numpy as np

#创建ndarray对象(法一)
a = np.array([1,2,3,4,5,6])
print(a,'->a',a.shape)

#创建ndarray对象(法二)
b = np.arange(0,5,1)#起始值,终止值,步长
print(b,'->b',b.shape)

#创建ndarray对象(法三)
c = np.zeros(10,dtype = 'int32')
print(c,'->c',c.shape)

#创建ndarray对象(法四)
d = np.ones((2,3),dtype = 'float32')#2行3列
print(d,d.shape,d.dtype,'->d')
print(np.ones(5)/5)#[1,1,1,1,1] / 5 =[0.2,0.2,0.2,0.2,0.2]

#扩展
print(np.zeros_like(d))#维度像d的数组,元素为0,2行3列

属性基础操作

import numpy as np

#shape基础操作
# np.ndarray.shape
a = np.arange(1,9)#shape = (9,)
print(a,a.shape,'->a')
a = np.arange(1,9).shape(2,4)
print(a.ndim) #2
a.shape = (2,4)
print(a,a.shape,'->a')

#dtype基础操作
# np.ndarray.dtype
print(a.dtype)
#a.dtype = 'float32'  #错误的修改数据类型的方式
b = a.astype('float32')  #a没有变
print(b,b.dtype,'->b')

#size基础属性
# np.ndarray.size元素的个数
print(b,'size:',b.size)#8
print(b,'lenth:',len(b))#返回最外层的行号

#index基础操作
c = np.arange(1,19)
c.shape = (3,2,3)#三维数组<页,行,列>
print(c)
print(c[0])#拿到第一页
print(c[0][1])#拿到第一页,第二行
print(c[0][1][0])#拿到第一页,第二行,第一列
print(c[0,1,0])

复合数据类型

import numpy as np
data = [
    ('xx',[12,40,25],2),
    ('yy',[10,20,8],2),
    ('zz',[10,9,9],1)
]

#第一种设置dtype的方式
a = np.array(data,dtype = 'U2, 3int32, int32')#为元组中每一个字段定义数据类型
#U2只保存两个unicode的字符
#3int32,出现了三个int32

#第二种设置dtype的方式
b = np.array(data,dtype=[('name','str',2),
                         ('scores','int32',3),
                         ('age','int32',1)])
print(b)
print(b[1]['age'])

#第三种设置dtype的方式
c = np.array(data,dtype={
    'names':['name','scores','age'],
                         'formats':['U2','3int32','int32']})
print(c)
print(c[1]['name'])



#测试数组中存储日期数据类型
dates = ['2011-01-01','2011','2011-02',
         '2012-01-01','2012-02-01 10:10:00']
dates = np.array(dates)
print(dates,dates.dtype)
#每一个unicode字符占位32
#转换类型
dates = dates.astype('M8[D]')#精确到天
print(dates,dates.dtype)
#dates = dates.astype('M8[s]')#精确到秒
#print(dates,dates.dtype)
print(dates[2] - dates[1])

3种变维方式

"""
    视图变维(数据共享):reshape()与ravel()
"""
import numpy as np
a = np.arange(1,9)
print(a, a.shape)
b = a.reshape(2,4)#视图变维:变为2行4列的二维数组
a[0] = 999
print(b)

c = b.reshape(2,2,2)#变为2页2行2列
print(c)
d = c.ravel()
print(d,'->d')
"""
    复制变维(数据独立):flatten()
"""
e = b.flatten()
b[0][0] = 88
print(e,'->e')

"""
    不需要返回值的变维
"""
c.shape = (2,4)#不需要返回值
print(c,'->c')
c.resize((8,))
print(c,'->c')

ndarray数组切片操作

import numpy as np
a = np.arange(1,10)
a.resize(3,3)
print(a)
print(a[:2, :2])#逗号前面切行,后面切列
print(a[::2, :])#要一三行,所有列
print(a[::2, ::2])#要一三行,一三列

mask操作

import numpy as np
a = np.arange(1,5)
mask = [True, False, True, False]
print(a[mask])#只显示值为true的

b = np.arange(100)
#输出100以内3的倍数
mask = b % 3 == 0
#print(mask) #布尔
print(b[mask])

#输出100以内既是3的倍数又是7的倍数
mask = (b % 3 == 0) & (b % 7 == 0) #用&!!!
print(mask)
print(b[mask])

#基于索引的掩码
names = np.array(['水稻','玉米','大豆','猪肉','葡萄'])
rank = [1, 0, 3, 4, 2]
print(names[rank])

pad补全长度不等数组

import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
#填充b数组使其长度与a相同,头部补0个元素,尾部补1个元素
b = np.pad(b, pad_width=(0, 1), mode='constant',
           constant_values=-1)#用-1补全
print(b)

组合(vstack)拆分(vsplit)数组操作

#垂直方向完成组合操作,生成新数组
c = np.vstack((a,b))
print(c,'->c')
#垂直方向完成拆分操作,生成两个数组
c, d= np.vsplit(c,2)#拆分成两个
print(c,d,'->c,d')
#h代表水平,d代表深度

#一维数组的组合方案
d = np.arange(1,9)
e = np.arange(9,17)
#把两个数组摞在一起成两行
print(d)
print(e)
print(np.row_stack((d,e)))#形成两行
print(np.column_stack((d,e)))#形成两列

#通过axis关键字参数指定组合方向
#0:垂直方向
#1:水平方向
#2:深度方向
#np.concatenate((a,b),axis = 0)

基础运算操作

import numpy as np

a = np.array( [[1,1],
               [0,1]])

b = np.array( [[2,0],
               [3,4]] )
c = a* b                     # 元素乘积
print(c)
d =a @ b                     #矩阵乘积
print(d)
e = a.dot(b)                 #矩阵乘积(法二)
print(e)

常用API


Numpy官方文档(中文版)
完全可以自学的良心网站

小白更(学)新(习)中…


一、创建数组

二、数组操作

三、二进制操作

四、字符串操作

五、数据类型相关


案例分析

问题描述:给出message.csv文件,需要:(1)加载数据文件;(2)统计基本数据(最小值、最大值、平均值等),做出业务分析;(3)统计给定条件下的数据占比。

import numpy as np
"""
    加载数据文件
"""
def loadtxt():
    """
    加载Customer.csv文件
    """
    header = []
    data = []
    with open('Customer.csv','r') as f:#使用with打开.csv文件
        for index,line in enumerate(f.readlines()):#遍历每一行,
                                                # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
            if index == 0:
                header = line[:-1].split(',')#如果index索引值为0,标题生成一个列表,去掉line的最后一行换行符,列表里的元素用逗号隔开,得到header列表
                #header = ['index','pack_type','extra_time','extra_flow','use_month','loss']
            else:
                data.append(tuple(line[:-1].split(',')))#转成元组形式
        result = np.array(data, dtype={'names':header,'formats':['f8','f8','f8','f8','f8','f8']})
    return result


data = loadtxt()
print(data.shape, data[0])


"""
    基本数据统计
"""

#统计额外剩余时长,额外剩余流量,使用月份的三个字段的最小值,最大值,平均值,做出业务分析。
print('-' * 100)
extra_time_col = data['extra_time']
print('[extra_time]min:',min(extra_time_col),'max:',max(extra_time_col),'mean:',sum(extra_time_col) / len(extra_time_col))
extra_flow_col = data['extra_flow']
print('[extra_flow]min:',min(extra_flow_col),'max:',max(extra_flow_col),'mean:',sum(extra_flow_col) / len(extra_flow_col))
use_month_col = data['use_month']
print('[use_month]min:',min(use_month_col),'max:',max(use_month_col),'mean:',sum(use_month_col) / len(use_month_col))


"""
    数据占比统计
"""
#统计所有有额外剩余通话时长(流量)的人数占总人数的比例
print('-' * 100)
print(data[data['extra_time'] > 0].size / data.size)
print(data[data['extra_flow'] > 0].size / data.size)


"""
    数据数量统计
"""
#统计每一类套餐的人数与总人数的占比并输出。
print('-' * 100)
types = set(data['pack_type'])
for t in types:
    print('套餐',t,':',len(data[data['pack_type']==t]) / len(data))

心得:python的numpy模块定义了ndarray对象,使编程更为灵活。更灵活的坏处就是它的API接口比较多,需要使用者记的东西也就很多。厚内核,薄接口,熟记API需要一点点的积累。

书籍推荐

利用python进行数据分析(第二版)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值