深入探索Numpy--索引,切片,随机数,文本操作等

简介: 深入探索Numpy--索引,切片,随机数,文本操作等

一、Numpy索引及切片

核心:基本索引及切片 / 布尔型索引及切片

基本索引及切片

ar = np.arange(20)

print(ar)

print(ar[4])

print(ar[3:6])

print(‘-----’)

1.一维数组索引及切片

一维数组和列表类似

ar = np.arange(16).reshape(4,4)

print(ar, ‘数组轴数为%i’ %ar.ndim) # 4*4的数组

print(ar[2], ‘数组轴数为%i’ %ar[2].ndim) # 切片为下一维度的一个元素,所以是一维数组

print(ar[2][1]) # 二次索引,得到一维数组中的一个值,单纯一个值的数组轴数为0

print(ar[1:3], ‘数组轴数为%i’ %ar[1:3].ndim) # 切片为两个一维数组组成的二维数组,不包含中间的

print(ar[2,2]) # 带逗号就是指定一个位置。切片数组中的第三行第三列 → 10

print(ar[:2,1:]) # 切片数组中的1,2行、2,3,4列 → 二维数组

print(‘-----’)

2.二维数组索引及切片

ar = np.arange(8).reshape(2,2,2)

print(ar, ‘数组轴数为%i’ %ar.ndim) # 222的数组

print(ar[0], ‘数组轴数为%i’ %ar[0].ndim) # 三维数组的下一个维度的第一个元素 → 一个二维数组

print(ar[0][0], ‘数组轴数为%i’ %ar[0][0].ndim) # 三维数组的下一个维度的第一个元素下的第一个元素 → 一个一维数组

print(ar[0][0][1], ‘数组轴数为%i’ %ar[0][0][1].ndim)

3.三维数组索引及切片

#三维

a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])

a1

a1[0, 0, 1]

4.布尔型索引及切片

ar = np.arange(12).reshape(3,4)

i = np.array([True,False,True])

j = np.array([True,True,False,False])

print(ar)

print(i)

print(j)

print(ar[i,:]) # 在第一维度做判断,只保留True,这里第一维度就是行,ar[i,:] = ar[i](简单书写格式)保留True的保留第一跟第三行

print(ar[:,j]) # 在第二维度做判断,这里如果ar[:,i]会有警告,因为i是3个元素,而ar在列上有4个

5.布尔型索引:以布尔型的矩阵去做筛选

m = ar > 5

print(m) # 这里m是一个判断矩阵 这里打印出True或者False

print(ar[m]) # 用m判断矩阵去筛选ar数组中>5的元素 得到一维数组 → 重点!后面的pandas判断方式原理就来自此处

二、数组索引及切片的值更改、复制

1.修改

ar = np.arange(10)

print(ar)

ar[5] = 100

ar[7:9] = 200

print(ar)

一个标量赋值给一个索引/切片时,会自动改变/传播原始数组

2.复制

np.array(object, dtype)

np.asarray(a, dtype)

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

#从现有的数组当中创建

a1 = np.array(a)

#相当于索引的形式,并没有真正的创建一个新的

a2 = np.asarray(a)

关于array和asarray的不同

array相当于深拷贝,完全独立的创建一份。原数组修改,新数组不变

asarray相当于浅拷贝。与原来数组内存地址一样,原数组修改,也会跟着被修改

ar = np.arange(10)

b = ar.copy()

b[7:9] = 200

print(ar)

print(b)

复制,copy的相当于深拷贝,存储空间独立,拷贝后的数据被修改,原数据不变

三、Numpy随机数

numpy.random包含多种概率分布的随机样本,是数据分析辅助的重点工具之一

1.随机数生成

samples = np.random.normal(size=(4,4))

print(samples)

生成一个标准正太分布的4*4样本值

2.随机数生成想要的样本值

numpy.random.rand(d0, d1, …, dn):生成一个[0,1)之间的随机浮点数或N维浮点数组 —— 均匀分布

import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析

% matplotlib inline

a = np.random.rand()

print(a,type(a)) # 生成一个随机浮点数

b = np.random.rand(4)

print(b,type(b)) # 生成形状为4的一维数组

c = np.random.rand(2,3)

print(c,type©) # 生成形状为2*3的二维数组,注意这里不是((2,3)) 元素都是0-1之间,如果向0-100 后面直接乘以100即可 c = np.random.rand(2,3)*100


3.正态分布

(1)基础概念复习:正态分布(理解)

a. 什么是正态分布

正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。

b. 正态分布的应用

生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

c. 正态分布特点

μ决定了其位置,其标准差σ决定了分布的幅度(胖瘦高低)。当μ = 0,σ = 1时的正态分布是标准正态分布。

标准差如何来?

d.方差

是在概率论和统计方差衡量一组数据时离散程度的度量

其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差。方差越小,数据越集中,正态分布越瘦高

e.标准差与方差的意义

可以理解成数据的一个离散程度的衡量

(2)正态分布创建方式

1、np.random.randn(d0, d1, …, dn)

功能:从标准正态分布中返回一个或多个样本值 ,返回多维数组

2、np.random.normal(loc=0.0, scale=1.0, size=None) #正态分布这种最常用

loc:float

此概率分布的均值(对应着整个分布的中心centre)

scale:float

此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

size:int or tuple of ints

输出的shape,默认为None,只输出一个值

3、np.random.standard_normal(size=None) #这个默认了loc=0.0, scale=1.0

返回指定形状的标准正态分布的数组。

举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个

x1 = np.random.normal(1.75, 1, 100000000)

4.绘图,根据正态分布数据,绘制直方图
import matplotlib.pyplot as plt
import random

#设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字符集

plt.rcParams['axes.unicode_minus'] = False # 设置负号正常显示

# 生成均匀分布的随机数
x1 = np.random.normal(1.75, 1, 100000000)

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(20, 10), dpi=100)

# 2)绘制直方图
plt.hist(x1, 1000)    #1000表示要分多少组,就是x轴上面分多少组展示数据。这里是分1000组,正态分布可以看出来什么范围存在的数据较多

# 3)显示图像
plt.show()

4.均匀分布

1. np.random.rand(d0, d1, …, dn)

  • 返回[0.0,1.0)内的一组均匀分布的数。

2. np.random.uniform(low=0.0, high=1.0, size=None)

  • 功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
  • 参数介绍:
  • low: 采样下界,float类型,默认值为0;
  • high: 采样上界,float类型,默认值为1;
  • size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。
  • 返回值:ndarray类型,其形状和参数size中描述一致。

3. np.random.randint(low, high=None, size=None, dtype=‘l’)

  • 从一个均匀分布中随机采样,生成一个整数或N维整数数组,
  • 取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

返回一个整数:

返回一个整数数组:

#生成均匀分布的随机数

x2 = np.random.uniform(-1, 1, 100000000)

4.画图看分布状况

import matplotlib.pyplot as plt

# 生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(10, 10), dpi=100)

# 2)绘制直方图
plt.hist(x=x2, bins=1000)  # x代表要使用的数据,bins表示要划分区间数,均匀分布每组数据是100000000/1000

# 3)显示图像
plt.show()


四、Numpy数据的输入输出

numpy读取/写入数组数据、文本数据 后续大多数用pandas方法读写文件,这里先了解下numpy的读写

1.存储数组数据 .npy文件

import os

os.chdir(‘C:/Users/Hjx/Desktop/’)

ar = np.random.rand(5,5)

print(ar)

np.save(‘arraydata.npy’, ar)

#也可以直接 np.save(‘C:/Users/Hjx/Desktop/arraydata.npy’, ar)

看下桌面保存

2.读取数组数据 .npy文件

ar_load =np.load(‘arraydata.npy’)

print(ar_load)

#也可以直接 np.load(‘C:/Users/Hjx/Desktop/arraydata.npy’)

我们尝试用open读取npy文件,报错

3.存储/读取文本文件 只能存数字类型元素,存其他类型元素报错

ar = np.random.rand(5,5)

np.savetxt(‘array.txt’,ar, delimiter=‘,’)

#np.savetxt(fname, X, fmt=‘%.18e’, delimiter=’ ‘, newline=’\n’, header=‘’, footer=‘’, comments='# '):存储为文本txt文件

delimiter=’ ’ 表示每个元素的分隔符

fmt=‘%.18e’ 表示存储的数据类型,%.18e表示科学计数法

查看存的文本。默认是科学计数法表示

我们改成浮点数

ar_loadtxt = np.loadtxt(‘array.txt’, delimiter=‘,’)

print(ar_loadtxt)

#也可以直接 np.loadtxt(‘C:/Users/Hjx/Desktop/array.txt’)

#读取文本,一定要指定分隔符 delimiter,否则报错

ar_loadtext = np.loadtxt(“array.txt”,delimiter=‘,’)

print(ar_loadtext)

我们看下读取的数据类型

默认读取出来的是float类型,我们可以指定

指定读取出来int类型


相关文章
|
5月前
|
BI 测试技术 索引
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-1
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
3月前
|
索引 Python
|
3月前
|
机器学习/深度学习 数据可视化 API
Python Numpy 切片和索引(高级索引、布尔索引、花式索引)
Python Numpy 切片和索引(高级索引、布尔索引、花式索引)
45 3
|
4月前
|
索引 Python
NumPy 教程 之 NumPy 切片和索引 7
NumPy 切片和索引用于访问和修改 `ndarray` 对象。类似于 Python 的列表切片, 使用索引 `[0-n]` 和切片 `slice(start, stop, step)` 或简写为 `[start:stop:step]` 来提取元素。单个索引 `[n]` 获取单个元素, `[n:]` 获取从 `n` 开始的所有元素, `[n:m]` 获取 `n` 至 `m-1` 的元素。省略号 `...` 保持选择维度与数组一致, 如 `a[...,1]` 获取所有第二列, `a[1,...]` 获取第二行, `a[...,1:]` 获取所有第二列及之后的元素。
26 4
|
3月前
|
索引 Python
NumPy 教程 之 NumPy 高级索引 9
NumPy高级索引包括整数数组索引、布尔索引及花式索引,能实现对数组元素的灵活访问与复杂操作。其中,花式索引通过整数数组指定目标轴的下标来选取元素,不同于切片,它总是返回新数组。例如,对二维数组使用倒序索引数组时,会得到指定行的新数组:[[16 17 18 19], [24 25 26 27], [28 29 30 31], [4 5 6 7]]。
37 1
|
4月前
|
索引 Python
NumPy 教程 之 NumPy 高级索引 3
NumPy高级索引包括整数数组索引、布尔索引及花式索引,能访问并操作数组中的任意元素。例如,使用整数数组索引可以从多维数组中选取特定位置的元素。对于一个4x3数组`x`,通过定义行索引`rows`和列索引`cols`为`[[0,0],[3,3]]`和`[[0,2],[0,2]]`,可以获取四个角的元素:`x[rows,cols]`,结果为`[[0 2] [9 11]]`。此外,结合切片与索引数组可进一步定制数据选择,如`a[1:3, 1:3]`或`a[...,1:]`等。
27 3
|
3月前
|
索引 Python
NumPy 教程 之 NumPy 高级索引 6
NumPy高级索引包括 using 整数数组、布尔数组等来 access 数组元素, enabling 复杂的操作和 modifications. **布尔索引** uses 布尔数组 to index 目标数组, filtering 元素 based on 条件.
20 2
|
4月前
|
索引 Python
NumPy 教程 之 NumPy 切片和索引 4
NumPy 切片和索引允许访问和修改 `ndarray` 对象的内容。类似于 Python 的列表切片, 可以使用 `start:stop:step` 形式的索引, 其中省略号代表默认值。
21 3
|
3月前
|
索引 Python
NumPy 教程 之 NumPy 高级索引 10
NumPy的高级索引功能强大,支持整数数组索引、布尔索引等多种方式,能够灵活访问和操作数组中的元素。花式索引通过整数数组选取特定位置的数据,不同于切片,它总是创建新数组。使用`np.ix_`处理多维索引时,可实现笛卡尔积效果,选取特定行与列的组合,如示例中从一个二维数组精确取出指定位置的子矩阵。
37 0
|
4月前
|
索引 Python
NumPy 教程 之 NumPy 切片和索引 1
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
23 0