Python数据分析Numpy基础知识(一)


在这里插入图片描述

概述

首先说一下这篇文章不是NumPy的教程,而是对学习的记录,旨在在以后需要用的时候能够知道What is NumPy。镇上官方Numpy参考手手册,这才是系统学习NumPy的真正去处。


什么是数据分析?

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用的信息形成结论而对结论加以详细研究、概括、总结的过程。
数据分析。

使用python做数据分析

1.Numpy 基础数值算法
2.Scipy 科学计算
3.matplotlib 数据可视化
4.pandas 序列高级函数

Numpy概述

  1. Numerical Python, 数值的python,补充了Python语言所欠缺的数值计算能力。
  2. Numpy是其他数据分析及机器学习库的底层库。
  3. Numpy完全标准C语言实现,效率充分优化。
  4. Numpy开源免费。

Numpy的历史

  1. 1995年, Numeric发布(numpy的前身)。
  2. 2001年,Scipy->Numarray,提供多维数组运算。
  3. 2005年,Numeric+Numarray -> Numpy
  4. 2006年,Numpy脱离Scipy称为独立项目。

Numpy的核心:多维数组

import numpy as np
np.array([1,2,3,4,5])
a = array + 10

Numpy的基础知识

ndarray数组

内存中的ndarray对象

元数据(metadata)
指的是 存储对目标数组的描述信息,如:dim count, dimensions, dtype, data等等。

实际数据
指的是 完整的数组内容

总结: 将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高效率。

注意:Numpy数组是同质数组,所有元素的数据类型必须相同。

1.ndarray的创建

(1)np.array(任何可以被解释为Numpy数组的逻辑结构)

# 创建数据
import numpy as np
array = np.array([1,2,3,4,5])

# np.arange(起始值(0),终止值,步长(1))
print(np.arange(0,10,1))
print(np.arange(0,10))
print(np.arange(10))

(2)np.zeros(数组元素个数,dtype=‘类型’)
(3)np.ones(数组元素格式,dtype=‘类型’)

# int类型默认为int32类型
a = np.zeros(10,dtype='int32')
print(a.dtype,a)

# float默认为float64类型
a = np.ones(10,dtype='float')
print(a.dtype,a)

a = np.ones(5,dtype='bool')
print(a.dtype,a)

# 输出结果
# int32 [0 0 0 0 0 0 0 0 0 0]
# float64 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
# bool [ True  True  True  True  True]

2.ndarray对象属性的基本操作

(1)数组的维度:array.shape

import numpy as np

a = np.arange(1,9)
print(a.shape,a)

# 二维数组:两行两列矩阵
a.shape = (2,4)
print(a.shape,a,sep='\n')

# 三维数组:两页两行的矩阵
a.shape = (2,2,2)
print(a.shape,a,sep='\n')

(2)元素的类型:array.dtype

# 测试元素的类型相关操作
b = np.arange(10)
print(b.dtype,b)

# 把b中的每个元素当做float来看待
# 返回新类型的数组(必须要重新赋值)
c = b.astype('bool')
print(b.dtype,b)
print(c.dtype,c)

(3)数组元素个数: array.size

# 测试数组元素的个数
a = np.arange(8).reshape(2,4)
print(a)

# 数组的总元素个数
print(a.size)

# 最外层[]数组中有多少个元素(相当于求出有多少行)
print(len(a))

(4)数组元素索引(下标)

# 测试数组索引操作
c = np.arange(1,28).reshape(3,3,3)
print(c)

print('数组页数:',c.shape[0])
print('数组行数',c.shape[1])
print('数组列数',c.shape[2])

# 第0页的数据
print(c[0])
# 第0页0行的数据
print(c[0][0])
# 0页1行2列
print(c[0][1][2]) # 或者print(c[0,1,2])

# for循环打印所有元素
for i in range(c.shape[0]):
    for j in range(c.shape[1]):
        for k in range(c.shape[2]):
            print(c[i,j,k],end=' ')

3.ndarray对象属性操作详解

(1)Numpy的内部基本数据类型
此处缺一个表格
(2)自定义复合类型

import numpy as np

data = [
    ('zs',[30,40,50],16),
    ('ls',[50,60,70],17),
    ('ww',[10,20,30],18)]
# 第一种设置dtype的方式
# 3个Unicode字符,3个32位整型组成的列表,整数
a = np.array(data,dtype='U3,3int32,int32')
print(a)
# 获取a数组中第一个元素的第一个字段值
print(a[0]['f0'])
# 获取'ww'数据
print(a[2]['f1'])

# 输出结果
# [('zs', [30, 40, 50], 16) ('ls', [50, 60, 70], 17)
#  ('ww', [10, 20, 30], 18)]
# zs
# [10 20 30]

print('----------------')
# 第二种设置dtype的方式
b = np.array(data,dtype={
    'names':['name','scores','age'],
    'formats':['U3','3int32','int32']})
print(b)
print(b[0]['scores'])

# 输出结果
# [('zs', [30, 40, 50], 16) ('ls', [50, 60, 70], 17)
#  ('ww', [10, 20, 30], 18)]
# [30 40 50]

print('----------------')
# 第三种设置dtype的方式
c = np.array(data,dtype=[
    ('name','str_',2),
    ('scores','int32',3),
    ('age','int32',1)
])
print(c)
print(c[2]['name'])
# 输出结果
# [('zs', [30, 40, 50], 16) ('ls', [50, 60, 70], 17)
#  ('ww', [10, 20, 30], 18)]
# ww

print('------------------')
# 第四种设置dtype的方式(按字节空间大小进行排列)
# 在存储数据时,name字段占用8字节,从0字节的位置开始输出
# scores字段占用12字节,从16字节的位置开始输出
# 虽然name字段没有把前16字节充分利用,但是
# 在内存中字段的位置偏移量是一致的,访问
# 效率将会得到提高
d = np.array(data,dtype={
    'name':('U2',0),
    'scores':('3int32',16),
    'age':('int32',28)
})

print(d)
print(d[0]['name'])
# 输出结果
# [('zs', [30, 40, 50], 16) ('ls', [50, 60, 70], 17)
#  ('ww', [10, 20, 30], 18)]
# zs


print('-----------------------------')
# 测试日期类型数组
e = np.array(['2011',
              '2012-01-01',
              '2013-01-01 01:01:01',
              '2012-02-01'])
print(e)
f = e.astype('M8[D]') # 中括号内的参数可以是Y M D h m s(年月日时分秒),如果不加中括号默认精确到秒
print(f.dtype,f)
print(f[2]-f[0])
print(f[2]+1)

# 输出结果
# ['2011' '2012-01-01' '2013-01-01 01:01:01' '2012-02-01']
# datetime64[D] ['2011-01-01' '2012-01-01' '2013-01-01' '2012-02-01']
# 731 days
# 2013-01-02

4.ndarray 数组对象维度操作

(1)视图变维(数据共享) :reshape() ravel()

a = np.arange(1,9)
print(a)

a = a.reshape(2,4)
print(a)

b = a.reshape(2,2,2)
print(b)

a[0,0] = 999
print(a)
print(b)

# 变成一维数组
b = b.ravel()
print(b)

(2)复制变维(数据独立): flatten()

c = a.flatten()
print(a)
print(c)
c[0] = 666

print(a)
print(c)

(3)就地变维: 使用shape属性直接改变元数组对象的维度,不返回新数组.resize(2,2)

# 就地变维
# 此时print(c)  [666   2   3   4   5   6   7   8]
c.shape = (2,4)
print(c)
c.resize(2,2,2)
print(c)

5.一维数组和多维数组的切片操作

import numpy as np
# 一维数组的切片操作
a = np.arange(1,10)
print(a)
print(a[:3])
print(a[3:6])
print(a[6:])
print(a[::-1])
print(a[-4:-7:-1])
print(a[-7::-1])
print(a[::])
print(a[::3])
print(a[2::3])
print('分割线--------------')
# 多维数组切片操作
a = a.reshape(3,3)
print(a)
print(a[:,2]) # 所有行的最后一列数据

6.ndarray数组的掩码操作

import numpy as np

a = np.array([34,67,60,45,67,90,78,50])
b = a >= 60
print(b)  # [False  True  True False  True  True]
print(a[b]) # [67 60 67 90]

# 索引掩码操作
indices = [7,6,5,4,3,2,1,0] # 倒序排列
print(a[indices]) # [50 78 90 67 45 60 67 34]

# 小案例: 输出100以内3与7的倍数
b = np.arange(100)
mask = (b%3==0) & (b%7==0) # 与操作用&,或操作用 |
print(b[mask])

7.多维数组的组合拆分

(1)垂直方向的操作

# 在垂直方向a与b摞起来
np.vstack((a,b))
# 把c数组在垂直方向拆成2个
np.vsplit(c,2)

(2)水平方向的操作

# 在水平方向上,a与b并起来
np.hstack((a,b))
# 把c数组在水平方向拆成2个
np.hsplit(c,2)

(3)深度方向的操作:

# 在深度方向a与b并起来
np.dstack((a,b))
# 把c数组在深度方向拆成2个
np.dsplit(c,2)

(4)多维数组组合与拆分的通用方法

# 实现a与b数组的组合操作
# axis:轴向
# 如果待组合数组都是二维数组
# axis:0 垂直方向组合
# axis:1 水平方向组合
# 如果待组合数组都是三维数组
# axis:0 垂直方向组合
# axis:1 水平方向组合
# axis:2 深度方向组合
np.concatenate((a,b),axis=0)
# 把c数组拆成2份, axis为轴向
np.split(c,2,axis=0)
# 自己做测试

(5)长度不等的数组的组合

# 长度不等的数组的组合(补全操作)
a = np.array([1,2,3,4,5])
b = np.array([6,7,8,9])
# 把b补成五个元素
b = np.pad(b,
           pad_width=(0,1), # 两个参数代表前面补0个,后面补1个
           mode='constant',
           constant_values=-1)
c = np.vstack((a,b))
print(c)

(6)简单的一维数组的组合方案

# 把a与b两个一维数组摞在一起成两行
np.row_stack((a,b))
# 把a与b两个一维数组组合在一起成两列
np.column_stack((a,b))

8.ndarray对象的其他常用属性

  • (1)ndim 维数(n维数组的n)
  • (2)itemsize 元素所占用字节数
  • (3)nbytes 数组所占用的总字节数
  • (4)real 复数的实部
  • (5)imag 复数的虚部
  • (6)T 二维数组的转置数组(翻转)
  • (7)flat 多维数组的扁平迭代器
import numpy as np
a = np.array([
    [1+1j,2+4j,3+7j],
    [4+2j,5+5j,6+8j],
    [7+3j,8+6j,9+9j],
])
print(a.ndim)
print(a.size)
print(a.itemsize)
print(a.nbytes)
print(a.real,a.imag,sep='\n')
print(a.T)
for i in a.flat:
    print(i)
print(a.tolist())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值