Python_Numpy学习

Numpy学习

N维数组对象ndarray

ndarray 数组与  列表均可以表示多维数据,区别在于 使用ndarray进行数据运算时可以不使用循环(使用list进行矩阵操作时要使用循环)

数组的生成:

 

# 创建数组可以指定数据类型,如果不指定就默认
a = np.arange(10)
print(a)
b = np.ones((3, 6))
print(b)
c = np.zeros((3, 6), dtype=np.int32)
print(c)

 

np.ones_like(a) 根据数组a的形状生成一个全一数组

np.zeros_like(a) 根据数组a 生成一个全0数组

np.full_like(a, val) 根据数组a 生成一个数组,每一个元素值都是val

 

np.linsapce() 根据起止数据等间距的填充数据,形成数组

np.concatenate() 将两个或多个数组合并成一个新的数组

# a = np.linspace(1, 10, 4)  # 第一个为起始,第二个为终止,第三个数是划分的元素个数
# print(a)
# b = np.linspace(1, 10, 4, endpoint=False)
# print(b)
# c = np.concatenate((a, b))  # 合并数组
# print(c)

 

 

 

import numpy as np


# # 生成指定维度的随机多维数组
# data = np.random.rand(2, 3)
# print(data)
# print(type(data))

# # list 转化为ndarray
# l = range(10)
# data = np.array(l)
# print(data)
# print(data.shape)
# print(data.ndim)
# print(type(data))

# # 嵌套序列转化为ndarray
# l2 = [range(10), range(10)]
# data = np.array(l2)
# print(data)
# print(data.shape)

# np.zeros, np.ones, np.empty

# np.zeros
zeros_arr = np.zeros((3, 4))

# np.ones
ones_arr = np.ones((2, 3))

#np.empty
empty_arr = np.empty((3, 3))

# np.empty 指定数据类型
empty_int_arr = np.empty((3, 3), int)

print(zeros_arr)
print("---------------")
print(ones_arr)
print("---------------")
print(empty_arr)
print("---------------")
print(empty_int_arr)

 

ndarray数组的变换

可以进行维度变换和元素类型变换

.reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变

.resize(shape) .reshape()功能一致,但要修改原数组

.swapaxes(ax1, ax2) 将数组n个维度中两个维度进行调换

.flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变

# # 维度变换
# # .reshape
# a = np.ones((2, 3, 4), dtype=np.int32)
# print(a.reshape((3, 8)))
# print("-----------------")
# print(a)  # a还是(2, 3, 4)维度

# # .resize
# a = np.ones((2, 3, 4), dtype=np.int32)
# a.resize((3, 8))
# print(a)  # 已经修改了a 的维度

# # .flatten()   将数组变为一维,不改变原数组维度
# a = np.ones((2, 3, 4), dtype=np.int32)
# print(a.flatten())
# print("-------------------")
# print(a)

 

数组类型变换:

将整数变为浮点数 astype()方法一定会创建一个新数组(拷贝)

# # 数组类型转换
# a = np.ones((2, 3, 4), dtype=np.int)
# b = a.astype(np.float)
# print(a)
# print("---------------")
# print(b)

 

ndarray数组想列表的转换

ls = a.tolist()

# # 数组向列表转化
# a = np.full((2, 3, 4), 25, dtype=np.int32)
# print(a)
# print("--------------------------")
# print(a.tolist())

 

 

 

 

矩阵运算与处理:

"""
"""
# # 矢量与矢量运算
# arr = np.array([[1, 2, 3],
#                [4, 5, 6]])
# print("元素相乘:")
# print(arr * arr)
#
# print("矩阵相加:")
# print(arr + arr)
# # 矢量与标量运算        点乘与点除
# print(1. / arr)
# print(2. * arr)

"""索引与切片    一维数组的索引与Python列表索引功能相似
                多维数组索引
                arr[r1:r2, c1:c2]  --->代表从矩阵切片范围(与MATLAB处理相似)
                [:]  --->代表某个维度的数据
                [r1:, :c1]--->
注意:所有的索引值都是从 0 开始(与MATLAB相区别)
"""
# 索引与切片
# 一维数组
arr1 = np.arange(10)
print(arr1)
print(arr1[2:5:2])  # 数字依次为起始编号:终止编号:步长
# 多维数组
arr2 = np.arange(12).reshape(3, 4)
print(arr2)
print(arr2[1])
print(arr2[0:2, 2:])
print(arr2[:, 1:3])

 

条件索引:

注意:多个条件组合使用时使用&  |  表示 和  或

 

# 条件索引
# 找出data_arr 2015年后的数据
data_arr = np.random.rand(3, 3)
print(data_arr)
print("")

year_arr = np.array([[2000, 2001, 2000],
                     [2005, 2002, 2009],
                     [2001, 2003, 2010]])
# 两个矩阵维数相同,数据也依次对应,现在筛选出年份大于2005的数据
filter_arr = data_arr[year_arr >=2005]
print(filter_arr)
print("")

# 多个条件
filter_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
print(filter_arr)

 

转置(transpose

高维数组转置要指定编号(012 3

# 转置
arr = np.random.rand(2, 3)
print(arr)
print(arr.transpose())
print("")
# 三维数组
arr3d = np.random.rand(2, 3, 4)
print(arr3d)
print("-------")
print(arr3d.transpose((1, 0, 2)))

 

 

通用函数

ceil   向上最接近的整数

floor  向下最接近的整数

rint   四舍五入

isnan  判断元素是否为NaN

multiply   元素相乘

divide   元素相除

# 通用函数
arr = np.random.randn(2, 3)
print(arr)
print(np.ceil(arr))
print(np.floor(arr))
print(np.rint(arr))
print(np.isnan(arr))

 

np.where

矢量版本的三元表达式  x if condition else y

使用np.where np.where(condition, x, y)

# np.where
arr = np.random.randn(3, 4)
print(arr)
print(np.where(arr > 0, 1, -1))  # 如果arr大于0 输出1,否则输出-1

 

常用的统计方法

np.mean , np.sum

np.max , np.min

np.std , np.var

np.argmax , np.argmin

np.cumsum , np.cumprod

# 数组与标量之间的运算
a = np.arange(14).reshape(2, 7)
print(a.mean())

 

注意:多维的话要指定维度,否则默认是在全部维度上做统计

# 求和
arr = np.arange(10).reshape(5, 2)
print(arr)
print(np.sum(arr))
print(np.sum(arr, axis=0))  # axis=0是指竖直方向的一列
print(np.sum(arr, axis=1))  # axis=1是指横向的一行

 

ndarray中元素级运算:

np.abs(x)  np.fabs()    计算各元素绝对值

np.sqrt(x)   计算数组各元素平方根

np.square(x) 计算数组各元素的平方

 

 np.log(x)  np.log10(x)   np.log2(x)   计算各数组的自然对数、10为底对数、2底对数

 

np.ceil(x)  np.floor(x)     计算数组各元素ceiling值(不超过元素的整数值)或floor值(小于元素的最大整数值)

np.rint(x)  计算各元素的四舍五入值

np.modf(x)  将数组各元素的小数和整数部分以两个独立数组形式返回

np.cos(x)  np.cosh(x)  计算数组各元素的普通型和双曲型三角函数

np.sin(x)  np.sinh(x)  

np.tan(x)  np.tanh(x)

np.exp(x)   计算数组各元素的指数值

np.sign(x)   计算数组各元素的符号值,1+),00),-1-)正数输出1.。。。。

 

 

 

 

 

 

np.allnp.any

all  全部满足条件

any  至少有一个元素满足条件

# np.all np.any
arr = np.random.randn(2, 3)
print(arr)
print(np.all(arr > 0))
print(np.any(arr > 0))

 

np.unique  找到唯一值并返回排序结果

# np.unique
arr = np.array([[1, 2, 1], [2, 3, 4]])
print(arr)
print(np.unique(arr))

 

文件存取

csv文件

说明:CSV文件只能存取一维二维数组

CSV(逗号分隔值)一种常见文件格式,用于批量处理数据。

 

文件写入CSV格式:

np.savetxt(frame,array,fmt=’.18e’,delimiter=None)

frame  文件、字符串或产生器,可以是.gz或者.bz2的压缩文件。

array   存入文件的数组

fmt     写入文件的格式,例如:%d%.2f%.18e

delimiter   分隔字符串,默认是任何空格

 

CSV文件读入:

np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=Flase)

frame  文件、字符串或产生器,可以是.gz或者.bz2的压缩文件。

dtype   数据类型,可选

delimiter   分隔字符串,默认是任何空格

unpack    如果True,读入属性将分别写入不同变量

 

# 存入CSV文件
a = np.arange(100).reshape(5, 20)
print(a)
print("-----------------------------")
np.savetxt("a.csv", a, fmt="%d", delimiter=",")  # 自动写入项目中

# 读入CSV文件
b = np.loadtxt("a.csv",dtype=np.int, delimiter=",")
print(b)

 

多维数据的存取

写入:

a. tofile(frame, sep=””, formate”%s”)

frame  文件、字符串

sep    数据分隔字符串,如果是空格,写入文件为二进制

format  写入数据格式

 

读出:

注意:使用该方法读取时需要知道存入文件时数组维度和元素类型

np.fromfile(frame, dtype=float, count=-1, sep=””)

frame  文件、字符串

dtype  读取的数据类型

count   读入元素个数,-1表示读入整个文件

sep    数据分隔字符串,如果是空格,写入文件为二进制

# 多维数据的存取
# 存入
a = np.arange(100).reshape(5, 10, 2)
a.tofile("b.dat", sep=",", format="%d")  # 如果没有sep=","则数据存为二进制文件(可以作为文件备份方式)
# 读出(文本文件)
c = np.fromfile("b.dat", dtype=np.int, count=-1, sep=",")
print(c)
c = np.fromfile("b.dat", dtype=np.int, count=-1, sep=",").reshape(5, 10, 2)
print(c)
# 读出(二进制文件)
a = np.arange(100).reshape(5, 10, 2)
a.tofile("b.dat",  format="%d")  # 文件为二进制格式,无法读出
c = np.fromfile("b.dat", dtype=np.int).reshape(5, 10, 2)  # 修改为文件格式
print(c)

 

NumPy的便捷文件存取:

存入:

np.save(fname, array) np.savez(fname, array)

frame:  文件名,以.npy为扩展名,压缩扩展名为.npz

array: 数组变量

读取:

np.load(fname)

frame:文件名,以.npy为扩展名,压缩扩展名为.npz

# NumPy的便捷文件存取
a = np.arange(100).reshape(5, 10, 2)
np.save("ahhh.npy", a)  # 保存格式也是二进制格式,不过在二进制文件开头有数组保存之前的原信息(包括维度,数据类型)
b = np.load("ahhh.npy")
print(b)

 

Numpy的随机数函数字库

随机数生成:

NumPydrandom字库(np.random.*)

rand(d0, d1, ...,dn) 根据d0-dn创建随机数数组,浮点数,在【0,1】之间产生并均匀分布

randn(d0,d1,d2...dn) 根据d0-dn创建随机数数组,标准正态分布

randint(low[,high,shape]) 根据shape创建随机数或整数数组,范围是【lowhigh

seed(s) 随机数种子,s是给定的种子值

import numpy as np
# rand  [0, 1]随机数
a = np.random.rand(3, 4, 5)
print(a)
# randn  生成正态分布随机数
sn = np.random.randn(3, 4, 5)
print(sn)
# rindint根据shape创建随机数或整数数组
b = np.random.randint(100, 200, (3, 4))
print(b)
# seed(s)  随机数种子,s是给定的种子值
np.random.seed(10)  # 调用同一个随机数种子。产生的随机数相同
print(np.random.randint(100, 200, (3, 4)))
print("-------------------------------------")
np.random.seed(10)
print(np.random.randint(100, 200, (3, 4)))

 

 

从已有数组中随机抽取元素构成数组:

shufflea 根据数组a 的第一轴进行随机排列,改变数组x

permutation(a) 根据数组a 的第一轴产生一个新的乱序数组,不改变数组x

choice(a, [, size,replace, p]) replace表示是否可以重用元素,默认为False

# 从已有数组中随机抽取元素构成数组
# shuffle
a = np.random.randint(100, 200, (3, 4))
print(a)
np.random.shuffle(a)  # 改变数组
print(a)
# permutation
a = np.random.randint(100, 200, (3, 4))
print(a)
print(np.random.permutation(a))  # 改变数组
print("----------------------------")
print(a)

# 随机抽取元素构成新数组
b = np.random.randint(100, 200, (8,))
print(b)
print(np.random.choice(b, (3, 2)))
print("**************************")
print(np.random.choice(b, (3, 2), replace=False))  # 选取元素不在重复
print("++++++++++++++++++++++")
print(np.random.choice(b, (3, 2), p=b/np.sum(b)))  # p代表元素抽取概率(元素越大,概率越大)

 

产生具有一定分布的随机数:

uniform(low, high, size) 产生均匀分布的数组,low为起始值,high为结束值

normal(loc, scale, size) 正态分布数组,loc均值,scale标准差,size形状

poisson(lam, size) 产生泊松分布数组,lam随机事件发生概率

# 产生具有一定分布的随机数
u = np.random.uniform(0, 10, (3, 4))
print(u)
print("###############################")
n = np.random.normal(10, 5, (3, 4))
print(n)

 

NumPy的统计函数

sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组

mean(a, axis=None) 根据给定轴axis计算数组a相关元素期望

average(a, axis=None, weight=None) 根据给定轴axis计算数组a相关元素加权平均值

std(a,axis=None) 根据给定轴axis计算数组a相关元素标准差

var(a, axis=None) 根据给定轴axis计算数组a相关元素方差

# 统计函数(1
a = np.arange(15).reshape(3, 5)
print(a)
print(np.sum(a))
print("")
print(np.mean(a, axis=1))
print(np.mean(a, axis=0))
print("")
print(np.average(a, axis=0, weights=[10, 5, 1]))  # weight 代表权重,每行权重为1051
print(np.std(a))
print(np.var(a))

 

min(a)  max(a) 计算数组a 中元素最小最大值

argmin(a)  argmax(a) 计算数组a中元素最小最大值的降一维后下标

unravel_index(index, shape) 根据shape将一维下标index转换为多为、维下标

ptp(a) 计算数组a 中元素极差

median(a) 计算数组a元素中位数(中值)

# 统计函数(2
b = np.arange(15, 0, -1).reshape(3, 5)
print(b)
print(np.max(b))
print(np.argmax(b))  # 一维
print("")
print(np.unravel_index(np.argmax(b), b.shape))  # 重塑为多维下标
print(np.ptp(b))  # 数组极差
print("")
print(np.median(b))  # 中位数

 

NumPy的梯度函数

说明:用于图像声音处理

梯度:连续值之间的变化率,即斜率

np.gradient(f) 计算数组f中元素梯度,当f 为多维时,返回每个维度梯度

 

图像数组表示

RGB模式:r 表示红色,取值范围0-255g.....b......

PIL库:图像处理库

 

待更......

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值