Python学习之高级数组(一)
1.Python基础学习之高级数组(一)
1.1视图:就是与较大数组共享相同数据的较小数组。Numpy包提供数据视图的概念是为了精确地控制内存的使用方式。 数组视图、切片视图、转置和重塑视图等
数组视图实例:
from numpy import*
M=array([[1.,2.],[3.,4.]])
v=M[0,:] #切片是数组的视图(切片视图),它与M享有相同的数据。
print(v)
v[-1]=0
print(v)
print(M) #注意:如果修改v,M也会同时被修改
print(v.base) #数组的属性base能够访问拥有数据的对象,若数组拥有本身的数据,
#则其属性base的值为none
print(v.base is M)
print(M.base)
运行结果:
[1. 2.]
[1. 0.]
[[1. 0.]
[3. 4.]]
[[1. 0.]
[3. 4.]]
True
None
切片视图:只有基本切片(主要为带冒号的索引表达式)将返回视图,而任何高级切片(如使用布尔值的切片)都将返回数据的副本。
例如:
a=arange(4)
b=a[[2,3]] #索引是一个列表[2,3],b是数组
print(b)
print(b.base is None) #数据被复制,b是数组
c=a[1:3]
print(c)
print(c.base is None)
M=M[:]
print(M)
补充:Numpy的试图与副本:
视图:是数据的一个别称或引用,通过该别称或引用亦便访问、操作原有数据,但是原有数据不会产生拷贝。如果对视图进行修改,他就会影响到原有数据(原有数据同时被修改),物理内存在同一位置。
副本: 是对一个数据的完整拷贝,如果对副本进行修改,它不会影响到原有数据,物理地址不存在同一个位置。
具体分为:
① 无复制:简单的复制不会创建数组对象的副本。它使用原始数据的相同id()来访问它。Id()返回python对象的通用标识符,类似于C中的指针。
一个数组的任何变化都反映在另一个数组上。例如,一个数组的形状改变另一个数组的形状。
② 视图或者浅复制:Numpy拥有ndarray.view()方法,是一个新的数组对象,并且可查看原始数组的相同数据。新数组的维数更改不会更改原始数据的维数。
实例:
from numpy import*
a=arange(6).reshape(3,2)
print(a)
b=a.view()
print(b)
c=b.reshape(2,3)
print(c)
print(a.shape) #注意:数组b(新视图)的维数改变不影响原始数据的维数
print(id(a))
print(id(b)) #两个数组的id不变
运行结果:
[[0 1]
[2 3]
[4 5]]
[[0 1]
[2 3]
[4 5]]
[[0 1 2]
[3 4 5]]
(3, 2)
144810752
144810112
③ 深复制(副本):ndarray.copy()函数创建一个深层副本。是数组及其数据的完整副本,不与原始数据共享。
实例:import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print ('数组 a:')
print (a)
print ('创建 a 的深层副本:' )
b = a.copy()
print ('数组 b:' )
print (b)
# b 与 a 不共享任何内容
print ('我们能够写入 b 来写入 a 吗?' )
print (b is a )
print ('修改 b 的内容:')
b[0,0] = 100
print ('修改后的数组 b:')
print (b)
print ('a 保持不变:')
print (a)
运算结果:
数组 a:
[[10 10]
[ 2 3]
[ 4 5]]
创建 a 的深层副本:
数组 b:
[[10 10]
[ 2 3]
[ 4 5]]
我们能够写入 b 来写入 a 吗?
False
修改 b 的内容:
修改后的数组 b:
[[100 10]
[ 2 3]
[ 4 5]]
a 保持不变:
[[10 10]
[ 2 3]
[ 4 5]]
- 2.数组比较:
数组比较是为了检查两个矩阵是否彼此接近。
布尔数组:元素是bool类型的数组。任何作用于数组的比较运算都将创建一个布尔数组,而不是布尔值。
例如:M=array([[2.,3.],[1.,4.]])
print(M>2) #数组的比较运算创建了布尔数组
运行结果为:[[False True]
[False True]]
注意:在条件语句中不能直接使用数组比较,应使用all和any方法。
例:
M=array([[2.,3.],[1.,4.]])
N=array([[1.,2.],[3.,3.]])
print(M==N) #返回布尔数组
print((M==N).all())
print((M!=N).any()) #返回Ture
if (abs(N-M)<1e-10).all(): #abs()函数返回数字的绝对值
print("The two arrays are close enough")
运行结果:[[False False]
[False False]]
False
True
相等判断:两个浮点数组的相等判断不是直接进行。在Numpy中用allclose()函数来判断,该函数判断了两个到达精度的数组是否相等。
因为两个浮点数可能无限接近而不相等。
例如:
data=random.rand(2)*1e-3 #random.rand()生成随机数组
small_error=random.rand(2)*1e-16
print(data)
print(small_error)
print(data==data+small_error)
print(allclose(data,data+small_error,rtol=1.e-5,atol=1.e-8)) #其误差是根据相对误差界限#rtol和atol给出的
运行结果:
[2.46971243e-04 6.77622235e-05]
[2.78354596e-17 6.88850359e-17]
[False False] True
- 3 数组索引
(1)除去基本的切片技术(见https://www.cnblogs.com/chenzhijuan-324/p/10577513.html)可以通过组合切片和整数来索引数组。这里介绍使用布尔数组根据数组中的元素的值来访问和修改数组的一部分。注意:索引操作的结果总是一个向量。
例如:
B=array([[True,False],[False,True]])
M=array([[2,3],[1,4]])
print(M[B]) #根据布尔数组进行索引
M[B]=10,20 #用其他值来替代索引所得的值
print(M)
M[M>2]=0 #M的所有大于2的元素均被0替代
print(M)
运算结果:
[2 4]
[[10 3]
[ 1 20]]
[[0 0]
[1 0]]
(2) Where命令:
基本结构:Where(condition,a,b) 该结构将布尔数组作为条件,并返回满足条件的数组元组的索引,或者根据布尔数组中的值返回不同的值
例如:
x=linspace(-4,4,5)
print(x)
print(where(x>0,sqrt(x),0))
print(where(x>0,1,-1)) #表示若x>0,返回1,否则返回-1
a=arange(9)
b=a.reshape((3,3))
print(b)
print(where(a>5)) #返回一个元组,这个元组包含了满足条件的元素的索引。
print(where(b>5))
运行结果:
[-4. -2. 0. 2. 4.]
[0. 0. 0. 1.41421356 2. ]
[-1 -1 -1 1 1]
[[0 1 2]
[3 4 5]
[6 7 8]]
(array([6, 7, 8], dtype=int64),)
(array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))
Python学习之高级数组(一)的更多相关文章
- Python科学计算学习之高级数组(二)
代码性能和向量化 背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行.而对于C.C++等编译性语言就需要在执行代码前将其编译为机器指令. ...
- Python学习第二天数组
1:Python定义数组:a=[0,1,2,3,4] ; 打印数组list(a); 这时:a[0]=0, a[1]=1, a[[2]=2...... 1.1:如果想定义一个很长的数组可以用到pyt ...
- 小甲鱼:Python学习笔记002_数组_元组_字符串
创建普通数组 >>> member=["山东黄金","九阳股份"] >>> member ['山东黄金', '九阳股份'] ...
- Python学习之高级特性
切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...
- python学习之高级特性:
切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...
- python学习 面向对象高级编程
---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...
- Python学习之数组类型一:
Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建: 向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...
- python学习9—文件基本操作与高级操作
python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
随机推荐
- mail 发送邮件
(1) 直接使用shell当编辑器 # mail -s "Hello from linuxde.net by shell" admin@linuxde.net hello,this ...
- android sdk manager更新地址
参考:http://www.oschina.net/question/1399261_195245 android sdk 用久了,想更新到最新的SDK包: 大连东软信息学院镜像服务器地址:- htt ...
- maven and jwt
以目前浅薄的理解,jwt就是一种加密token的手段,这个token也只有自己能解开,如果客户端以cookie存这个token,可能会存在cookie被窃取的情况. 另外,jwt这中加密方式因为有过期 ...
- Win7 vs2017 WDK 1803 1809 驱动开发 出错 KMDF
一.编译出错, 1. 包含头文件出错 解决方案: 需要下载1803 的wdk 最新的1809会出一堆错误 安装程序显示是10.0.17134.1安装完成后是10.0.17134.0 2. Inf2C ...
- Spring-Cloud-Ribbon学习笔记(二):自定义负载均衡规则
Ribbon自定义负载均衡策略有两种方式,一是JavaConfig,一是通过配置文件(yml或properties文件). 需求 假设我有包含A和B服务在内的多个微服务,它们均注册在一个Eureka上 ...
- iOS 定时器 NSTimer、CADisplayLink、GCD3种方式的实现
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...
- linux下用php将doc、ppt转图片
解决方案分成两步: (1)调用unoconv命令将 doc.ppt 转 pdf (2)使用 imagemagick将 pdf 转图片 步骤 1.安装unoconv sudo apt-get insta ...
- array_walk与array_map的区别
1.array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的只能用array_walk($aIds ...
- mysql之表格的关联关系
1.’基本模式有多对一,多对多,一对一.关联的两个基本组建为外键列和参照列 典型的多对一模式,很普遍,如部门表和员工表,即一个部门可以有多个员工. 对于多对多的模式,就需要建立中间表,将其转换为多对一 ...
- 接口自动化测试 (三)request.post
上一节介绍了 requests.get() 方法的基本使用,本节介绍 requests.post() 方法的使用: 本文目录: 一.方法定义 二.post方法简单使用 1.带数据的post 2 ...