Numpy_基础

Numpy库

1 Numpy库的安装

用于数据处理(矩阵处理)

在这里插入图片描述

确定库是否安装成功: python3 -c “import numpy” 没有提示信息则安装成功

2 基本操作

2.2 数据维度创建数据 np.array() array.ndim 数组维度 1 2 3
添加合并数据 np.concatenate() 合并数组 np.expand_dims() 数组升维 np.vstack()竖向合并 np.hstack()横向合并
观察形态 array.size 数组中元素总个数 array.shape 各个维度的元素个数 (2,3)
2.3数据选择单个选取 array[1] array[1,2,3] array[1][1]
切片划分 array[:3] array[2:4(x), 1:3(y)]
条件筛选 array[array<0] np.where(array, array < 0)
2.4基础运算加减乘除 +-*/ np.dot()
数据统计分析 np.max() np.min() np.sum() np.prod() np.count() np.std() np.mean() np.median()
特殊运算符号 np.argmax() np.argmin() np.ceil() np.floor() np.clip()
2.5改变数据形态改变形态 array[np.newaxis, :] array.reshape() array.ravel(), array.flatten() array.transpose()
合并 np.column_stack(), np.row_stack() np.vstack(), np.hstack(), np.stack() np.concatenate()
拆解 np.vsplit(), np.hsplit(), np.split()

2.1 Numpy和Python List 的区别

2.1.1 Numpy Array np.array()

使用Numpy Array定义数组:

import numpy as np
np.array([1,2,3])
np.array(list)
2.1.2 List和Numpy Array的共同点
  • 存储与读取相同
my_list = [1,2,3]
print(my_list[0])

my_array = np.array([1,2,3])
print(my_array[0])
  • 修改相同
my_list[0] = 0
my_array[0] = 0
print(my_list)
print(my_array)
  • Numpy数组存储在连续的物理地址,运算速度快于List
  • Numpy Array 存储的数据格式有限制,同一种数据格式有利于批量的数据计算
import numpy as np
import time

t0 = time.time() #记录时刻
# python list
l = list(range(100))
for _ in range(10000):
    for i in range(len(l)):
        l[i] += 1    #每个位置+1

t1 = time.time()
# numpy array
a = np.array(l)
for _ in range(10000):
    a += 1   #整个数组一起+1

print("Python list spend {:.3f}s".format(t1-t0))
print("Numpy array spend {:.3f}s".format(time.time()-t1))

在这里插入图片描述

2.2 数据维度

涉及功能:

  • 创建数据

  • np.array()

  • array.ndim 数组维度 1 2 3

  • 添加合并数据

  • np.concatenate() 合并数组

  • np.expand_dims() 数组升维

  • np.vstack()竖向合并

  • np.hstack()横向合并

  • 观察形态

  • array.size 数组中元素总个数

  • array.shape 各个维度的元素个数 (2,3)

2.2.1 创建数据
#一维数据
import numpy as np

cars = np.array([5, 10, 12, 6])
print("数据:",cars,"\n维度:",cars.ndim)

在这里插入图片描述

#二维数据
import numpy as np

cars = np.array([
    [5, 10, 12, 6],
    [5.1, 8.2, 11, 6.3]
])
print("数据:",cars,"\n维度:",cars.ndim)

在这里插入图片描述

#三维数据
import numpy as np

cars = np.array([
[
    [5, 10, 12, 6],
    [5.1, 8.2, 11, 6.3]
],
[
    [6, 10, 12, 6],
    [5.1, 8.2, 11, 6.3]
]
])
print("总维度:",cars.ndim)
print("场地 1 数据:\n", cars[0], "\n场地 1 维度:", cars[0].ndim)
print("场地 2 数据:\n", cars[1], "\n场地 2 维度:", cars[1].ndim)

在这里插入图片描述

2.2.2 添加数据
  • np.concatenate([array1,array2]) 将两个数组合并成一维数组
  • np.concatenate([array1,array2], axis =0 ) 在第一个维度(x)上叠加(默认)
  • np.concatenate([array1,array2], axis =1 ) 在第二个维度(y)上叠加

前提要求数据维度对齐,此函数不改变数组维度

##一维数组->一维数组
cars1 = np.array([5, 10, 12, 6])
cars2 = np.array([5.2, 4.2])
cars = np.concatenate([cars1, cars2])
print(cars)
#[ 5.  10.  12.   6.   5.2  4.2]

##一维数组->二维数组->二维数组
test1 = np.array([5, 10, 12, 6])
test2 = np.array([5.1, 8.2, 11, 6.3])

# 首先需要把它们都变成二维,下面这两种方法都可以加维度
test1 = np.expand_dims(test1, 0)
test2 = test2[np.newaxis, :]

print("test1加维度后 ", test1)
print("test2加维度后 ", test2)

# 然后再在第一个维度上叠加
all_tests = np.concatenate([test1, test2])
print("括展后\n", all_tests)

在这里插入图片描述

  • np.expand_dims(array1, 0) array[np.newaxis, :] 数组升维
    在这里插入图片描述
a = np.array([
[1,2,3],
[4,5,6]
])
b = np.array([
[7,8],
[9,10]
])

print(np.concatenate([a,b], axis=1))  # 这个没问题
# print(np.concatenate([a,b], axis=0))  # 这个会报错
  • np.vstack([array1, array2]) 竖向合并数据
  • np.hstack([array1, array2]) 横向合并数据
a = np.array([
[1,2],
[3,4]
])
b = np.array([
[5,6],
[7,8]
])
print("竖直合并\n", np.vstack([a, b])) #第一维度
print("水平合并\n", np.hstack([a, b])) #第二维度

在这里插入图片描述

2.2.3 观察形态
  • array1.shape 数组维数(仅包含有数据位置)
print("第一个维度:", cars.shape[0]) #第一个维度的元素个数 3
print("第二个维度:", cars.shape[1]) #第二个维度的元素个数 4
print("所有维度:", cars.shape) #(3,4)

2.3 数据选择

  • 单个选取
  • array[1]
  • array[1,2,3]
  • array[1][1]
  • 切片划分
  • array[:3]
  • array[2:4(x), 1:3(y)]
  • 条件筛选
  • array[array<0]
  • np.where(array, array < 0)
2.3.1 单个数据的选择
a = np.array([1, 2, 3])
print("a[0]:", a[0])  #1
print("a[1]:", a[1])  #2
print("a[[0,1]]:\n", a[[0,1]])  #[1,2]
print("a[[1,1,0]]:\n", a[[1,1,0]]) #[2,2,1]

b = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
# 选第 2 行所有数
print("b[1]:\n", b[1])   #[5,6,7,8]
# 选第 2 行,第 1 列的数
print("b[1,0]:\n", b[1,0])   #5
# 这个看着有点纠结,如果对应到数据,
# 第一个拿的是数据位是 [1,2]
# 第二个拿的是 [0,3]
print("b[[1,0](x),[2,3](y)]:\n", 
b[[1,0],
[2,3]])    #[7,4]
2.3.2 切片划分(批量取数)

左闭右开

a = np.array([1, 2, 3])  
print("a[0:2]:\n", a[0:2]) #[1,2] 
print("a[1:]:\n", a[1:]) #[2,3]
print("a[-2:]:\n", a[-2:]) #[2,3]

b = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])

print("b[:2]:\n", b[:2]) # [[1,2,3,4],
                           #[5,6,7,8]]
print("b[:2(x), :3(y)]:\n", b[:2, :3])  #[[1,2,3],
                                        #[5,6,7]]
                                        
print("b[1:3(x), -2:(y)]:\n", b[1:3, -2:])   #[[7,8],
                                             # [11,12]]
2.3.3 条件筛选
  • 按位置选

  • 按数条件选 array1[array1>0] array[逻辑判断]

  • np.where(condition,array1(true), array2(false)) 满足条件数为array1的数,不满足条件为array2的数

a = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
condition = a > 7
b = -a - 1
print(np.where(condition, a, b))
##
[[-2 -3 -4 -5]
 [-6 -7 -8  8]
 [ 9 10 11 12]]

2.4 基础运算

  • 加减乘除
  • +-*/
  • np.dot()
  • 数据统计分析
  • np.max() np.min() np.sum() np.prod() np.count()
  • np.std() np.mean() np.median()
  • 特殊运算符号
  • np.argmax() np.argmin()
  • np.ceil() np.floor() np.clip()
加减乘除(可实现数点加减乘除的效果)
加减乘除array1 ±*/ 8
矩阵乘法array1.dot(array2) np.dot(array1, array2) A*B
矩阵外积np.outer(array1, array2)=A_ji*B
矩阵内积np.inner(array1, array2)= A*(B^T)
数据分析
最大最小值array1.max() np.max(array1);
array1.min() np.min(array1)
累加array1.sum()
累乘array1.prod()
元素个数array1.size()
非零个数np.count_nonzero(array1)
平均数np.mean(array1)
中位数np.median(array1)
标准差np.std(array1)
特殊运算符号
最大/小值索引np.argmax(array1) np.argmin(array1)
向上取整np.ceil(array1)
向下取整np.floor(array1)
上下界截取array1.clip(down,up)

2.5 改变数据形态

  • 改变形态
  • array[np.newaxis, :]
  • array.reshape()
  • array.ravel(), array.flatten()
  • array.transpose()
  • 合并
  • np.column_stack(), np.row_stack()
  • np.vstack(), np.hstack(), np.stack()
  • np.concatenate()
  • 拆解
  • np.vsplit(), np.hsplit(), np.split()

array1 = np.array([1,2,3,4,5,6])

改变形态维数变化
增加维度array1[np.newaxis, :](m,-)->(1,m)
a[:, None](m,-)->(m,1)
np.expand_dims(a, axis=0)(m,-)->(1,m)
np.expand_dims(a, axis=1)(m,-)->(m,1)
减少维度(只减少shape=1的维度)np.squeeze(array1_expand)
array1_expand.squeeze(axis=1)
(m,1)->(m,-)
矩阵重塑array1.reshape([m,n])(支持三维)(m*n,-)->(m,n)
矩阵转置array1.T np.tranapose(array1)(m,n) -> (n,m)
a1 shape: (2, 3)
[[1 2 3]
 [4 5 6]]
a2 shape: (3, 1, 2)
[[[1 2]]  #最里面的数据是最后一维的!!!!!!

 [[3 4]]

 [[5 6]]]
合并维数变化
数组以行为单位合并np.row_stack([array1, attay2])2***(m,-)**->(2,m)
数组对应位置合并(以列为单位)np.column_stack([array1, attay2])2*(m,-)->(m,2)
数组以行(第一维度)为单位合并(维度必须正确)np.vstack([array1, attay2])2***(1,m)**->(2,m)
数组以列(第二维度)为单位合并 (维度必须正确)np.hstack([array1, attay2])2*(m,1)->(m,2)
矩阵以第一维度合并print(np.concatenate([array1, attay2], axis=0))2*(2,2)->(4,2)
矩阵以第二维度合并print(np.concatenate([array1, attay2], axis=1))2*(2,2)->(2,4)
拆解维数变化
从第一维度分(横切)np.vsplit(array1, indices_or_sections=2) # 分成两段
np.vsplit(array1, indices_or_sections=[2,3]) # 分片成 [:2],[2:3], [3:]
(m,n)->2*(m/2,n)
从第二维度分(纵切)np.hsplit(array1, indices_or_sections=2) # 分成两段
np.hsplit(array1, indices_or_sections=[2,3]) # 分片成 [:2],[2:3], [3:]
(m,n)->2*(m,n/2)
按维度自定义切分np.split(a, indices_or_sections=2, axis=0) # 第一维度,分成两段
np.split(a, indices_or_sections=[2,3], axis=1) # 在第二维度,分片成 [:2],[2:3],[3:]

3 经验式操作

①使用列表存储二维表的表头,便于索引。如下面的 covid[“header”]存储的是全部表头,通过.index(“”)可找到对应表头的索引。

confirm_idx = covid["header"].index("Confirmed")

covid = {
    "date": [],
    "data": [],
    "header": [h for h in data[0].strip().split(",")[1:]]
}
for row in data[1:]:
    split_row = row.strip().split(",")
    covid["date"].append(split_row[0])
    covid["data"].append([float(n) for n in split_row[1:]])

4 举例: 数据清洗

数据清洗 | 莫烦Python (mofanpy.com)

常见的脏数据类型:

  • 数据值缺失 None=np.nan(np.float)->其他数据的平均值替代
  • 数据值异常大或小
  • 数据格式不统一
  • 非独立数据错误

注意:data.dtype=object描述的是数据类型,这种数据类型是无法参与Numpy运算的,只有 dtypeintfloat 这样的数值形式,才能参与运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值