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]]

  1. 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

  1. 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学习之高级数组(一)的更多相关文章

  1. Python科学计算学习之高级数组(二)

    代码性能和向量化 背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行.而对于C.C++等编译性语言就需要在执行代码前将其编译为机器指令. ...

  2. Python学习第二天数组

    1:Python定义数组:a=[0,1,2,3,4] ;   打印数组list(a); 这时:a[0]=0, a[1]=1, a[[2]=2...... 1.1:如果想定义一个很长的数组可以用到pyt ...

  3. 小甲鱼:Python学习笔记002_数组_元组_字符串

    创建普通数组 >>> member=["山东黄金","九阳股份"] >>> member ['山东黄金', '九阳股份'] ...

  4. Python学习之高级特性

    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...

  5. python学习之高级特性:

    切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...

  6. python学习 面向对象高级编程

    ---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...

  7. Python学习之数组类型一:

    Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建:  向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...

  8. python学习9—文件基本操作与高级操作

    python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...

  9. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

随机推荐

  1. Hadoop:hdfs文件permission denied问题解析

    Cron jobs can be scheduled, but fail to write parquet file and seems due to user permission of “yarn ...

  2. python 遍历hadoop, 跟指定列表对比 包含列表中值的取出。

    import sys import tstree fname = 'high_freq_site.list' tree = tstree.TernarySearchTrie() tree.loadDa ...

  3. CUDA加opencv复现导向滤波算法

    CUDA是GPU通用计算的一种,其中现在大热的深度学习底层GPU计算差不多都选择的CUDA,在这我们先简单了解下其中的一些概念,为了好理解,我们先用DX11里的Compute shader来和CUDA ...

  4. ubuntu源码安装jdk8

    最近学习java,想起来没有在Ubuntu上使用过 因此想安装下环境,并在Ubuntu上试用MPXJ读取mpp文件 1.安装 下载jdk8 https://www.oracle.com/technet ...

  5. VxWorks信号量问题

    VxWorks主要提供如下API进行信号量的创建.获取和释放:   参数1:SEM_Q_PRIORITY,SEM_Q_FIFO SEM_Q_PRIORITY(值为0x1):需要获取该信号量的任务基于优 ...

  6. numpy和tensorflow中的广播机制

    广播的引出 numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import numpy as np x = np.array([[2,2,3],[1,2,3]]) y = np.arra ...

  7. python 3 往Excel 中的写入内容但不覆盖原内容

    EXCEL 写入数据保持原样式 import xlwt import xlrd import xlutils import xlutils.copy class ExcelHandle(): def ...

  8. C/S,B/S的区别

    一.概念说明 C/S(Client/Server(客服机/服务器))架构:客户端/服务器架构.通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客服端才可进行管理操作. ...

  9. PHP(Dom操作)

    jsDOM操作组成: ECMAscript:语法核心 BOM:浏览器对象模型 window:窗口 open close 定时器 dingsh history:历史记录 go back location ...

  10. Python学习之旅(二十七)

    Python基础知识(26):常用内建模块(Ⅱ) 1.hashlib Python的hashlib提供了常见的摘要算法,如MD5,SHA1等 摘要算法又称哈希算法.散列算法. (1)它通过一个函数,把 ...