深入探索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类型


相关文章
|
4天前
|
Ubuntu Linux 计算机视觉
NumPy 秘籍中文第二版:二、高级索引和数组概念
NumPy 秘籍中文第二版:二、高级索引和数组概念
52 0
|
4天前
|
BI 索引 Python
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
79 0
|
4天前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
37 0
|
4天前
|
存储 测试技术 程序员
【Python】—— NumPy基础及取值操作
【Python】—— NumPy基础及取值操作
8 1
|
4天前
|
存储 索引 Python
NumPy 数组切片及数据类型介绍
了解 NumPy 数组切片,用于从数组中提取子集。一维数组切片使用 `start:end:step`,如 `arr[1:5]`。二维数组切片如 `arr[1:3, 0:3]`。创建 5x5 数组并练习切片,例如打印第一行、第二列、对角线元素和 2x2 子数组。别忘了检查数据类型,如 `arr.dtype`,并使用 `astype()` 转换类型。
24 0
|
4天前
|
存储 索引 Python
NumPy 数组创建方法与索引访问详解
NumPy 的 `ndarray` 是其核心数据结构,可通过 `array()`、`zeros()`、`ones()` 和 `empty()` 函数创建。`array()` 可以将列表等转换为数组;`zeros()` 和 `ones()` 生成全零或全一数组;`empty()` 创建未定义值的数组。此外,还有 `arange()`、`linspace()`、`eye()` 和 `diag()` 等特殊函数。练习包括使用这些函数创建特定数组。
117 1
|
4天前
|
数据处理 计算机视觉 索引
NumPy中的布尔索引与花式索引详解
【4月更文挑战第17天】本文介绍了NumPy中的布尔索引和花式索引,这两种高级索引方式增强了数组操作的灵活性。布尔索引利用布尔数组过滤数据,如`array[bool_array]`用于根据条件筛选元素;在数据分析中,这对条件筛选非常有用。花式索引包括切片、数组和元组索引,允许非整数位置访问元素。例如,数组索引`array[index_array]`按指定位置选取元素,元组索引适用于多维数组的选择。掌握这两种索引能提升数组数据处理的效率。
|
4天前
|
机器学习/深度学习 计算机视觉 索引
NumPy索引与切片的高级技巧探索
【4月更文挑战第17天】探索NumPy的高级索引与切片技巧:整数数组、布尔和花式索引用于灵活选取元素;切片步长、反转及多维切片操作实现高效数组处理。在数据分析、图像处理和机器学习等领域有广泛应用,提升代码效率与可读性。
|
4天前
|
索引 Python 数据处理
【Python Numpy教程】切片和索引
【Python Numpy教程】切片和索引
【Python Numpy教程】切片和索引
|
4天前
|
机器学习/深度学习 数据挖掘 Python
NumPy 中级教程——线性代数操作
NumPy 中级教程——线性代数操作
173 4