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. .net Core 生产环境报错 MIME

    because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. 主要没 ...

  2. 【规范】前端编码规范——css 规范

    编码 在 css 首行设置文件编码为 UTF-8. @charset "UTF-8"; class 命名 class 名称应当尽可能短,并且意义明确.使用有意义的名称,使用有组织的 ...

  3. virtualbox 在物理机是无线网卡的时候做桥接配置

    在“计算机”图标上右键选择“管理”,在打开的“计算机管理”窗口中选择左侧的“设备管理器”,然后在右侧图示的地方右键选择“添加过时硬件”. 在打开的窗口中点击“下一步”. 选择“安装我手动从列表中选择的 ...

  4. myeclipse中的classpath .

    博客分类: java基础   myeclipse中的classpath是一个很重要的问题 myeclipse的在查找的时候都是按照其查找,而且myeclipse有一个专门的文件来保存classpath ...

  5. 干货 | Ansible 上手指南

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/O4dC8OjO7ZL6/article/details/79765539 点击上方"中兴开 ...

  6. windows 10 更新补丁包

    http://www.catalog.update.microsoft.com/Search.aspx?q=windows%2010%20prohttp://www.catalog.update.mi ...

  7. SpringBoot------集成MyBatis报错

    在spring boot启动main方法所在的类中加入 @MapperScan注入后报错: Invalid default: public abstract java.lang.Class org.m ...

  8. 转载:sigmoid和softmax总结

    转自:http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数): 引用wiki百科的定义: A logi ...

  9. 关于vmware 11.1安装windows 7操作系统时报错 Unist specified don’t exist. SHSUCDX can’t install

    笔者今天在vmware 11.1 虚拟机下使用光驱安装windows 7 32位操作系统时,报错: Unist specified don’t exist. SHSUCDX can’t install ...

  10. dubbo+zookeeper+spring实例

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...