一、Numpy库与多维数组
# Author:Zhang Yuan
import numpy as np
'''重点摘录:
轴的索引axis=i可以理解成是根据[]层数来判断的,0表示[],1表示[[]]...
Numpy广播的规则可理解成:结构相同,点对点;结果不同,分别匹配。[]是最小单元,按最小单元匹配。
Numpy中逻辑尽量用逻辑操作运算符&/|,少用关键字and/or
Numpy的向量化操作比纯Python速度更快。
ndarray的基本运算 + - * / // 等... 会调用对应的通用函数,为数组中元素的运算。
'''
#NumPy 最重要的一个特点是其 N 维数组对象 ndarray。 #ndarray对象的维度是通过多层[]来确定的。[...]表示一维数据,[[...]]表示二维数据,[[[...]]]表示三维数据...
#轴的索引axis=i是根据[]层数来判断的,0表示[],1表示[[]]... # [,]中的逗号,表示当前所在维度层的数据划分。[1,2,3] 一维划分。[[1, 2], [3, 4]] 外部逗号为第一层维度(行)划分,内部逗号为第二层维度(列)的划分 # int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替 #赋值系列---------------------------------------------------------------
#原数据输入的方式形成数组:
#原数据输入可以是各种类型。
#"层次相同、数据个数相同"会默认转成多维数组,也就是严格符合多维数组格式的会自动转换.
print(np.array([1,2,[3]])) #[1 2 list([3])],只有一个二层次
print(np.asarray([(1,),2,[3]])) #[(1,) 2 list([3])],只有一个一层次
print(np.array([(1,),(2,),[3,]])) #[[1],[2],[3]],都是二层次,转换
print(np.asarray([(1,),(2,),(3,)])) #[[1],[2],[3]],都是二层次,转换
print(np.array([(1,2),(3,)])) #[(1, 2) (3,)],都二层,但大小不同
print(np.asarray([(1,2),(3,4)])) #[[1, 2],[3, 4]],都二层且大小相同,转换 #创建的方式形成数组:
#以shape维度描述来创建。
print(np.zeros((3,2))) #empty(),ones()
#以buffer来创建,用于实现动态数组。
#buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
print(np.frombuffer(b'Hello World',dtype = 'S1'))
print(np.frombuffer(np.array([1,2,3,4,5]),dtype=int))
#以迭代对象来创建
print(np.fromiter(range(5),dtype=int))
#以数值范围来创建
print(np.arange(10,20,2)) #[10 12 14 16 18]
print(np.linspace(1,10,10)) #[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
print(np.logspace(1,2,num=2)) #[ 10. 100.]
#-------------------------------------------------------------------------- #访问系列------------------------------------------------------------------
#切片还可以包括省略号 ...,来使选择元组的长度与数组的维度相同。如果在行位使用省略号,它将返回包含行中元素的 ndarray
#多维数组的切片和索引[,]中第一层逗号表示维度划分,第一层逗号分割的左右部分一定是按照维度顺序.
#多维数组若没有第一层逗号,会默认加上第一层逗号。但仅传入元组逗号省略。
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[...,1:]) # [[2 3],[5 6],[8 9]],相当于a[:,1:].
print(a[(1,2)]) # 6, 仅传入元组括号省略:a[1,2]=6.
print(a[[1,2]]) # [[4 5 6],[7 8 9]], 默认加上第一层逗号,相当于a[[1,2],]
print(a[[-1,-3]]) #[[7 8 9],[1 2 3]], 默认加上第一层逗号,相当于a[[-1,-3],]
print(a[(1,2),]) # [[4 5 6],[7 8 9]],相当于a[(1,2),:],行1、2,列全部 #多维多值索引一定要一一配对,且输出形式与输入的索引形式相同
print(a[[0,1,2], [0,1,0]]) #[1 5 7],多值索引。一对一:0-0,1-1,2-0
print(a[ [ [0,0],[2,2] ] , [ [0,2],[0,2] ] ]) #[[1 3], [7 9]]
print(a[np.array([[1],[2]]),np.array([[0],[2]])]) #[[4], [9]]
print(a[ [[1],[2]] , [[0],[2]] ]) #[[4], [9]] #多维多值索引各维度层次不同,会自动默认到最高层次.
#各维度表示形式相同,点对点匹配,且大小必须相同。各维度表示形式不同,以不同的形式分别匹配。
x=np.arange(12).reshape((3,4))
'''x=array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])'''
print(x[ [1,2,0] , [[[3,1,0]]] ]) #[[[7 9 0]]] 各维度表示形式相同,点对点匹配;层次不同,会自动默认到最高层次.
x1=x[ [[1],[2],[0]] , [[3,1,0]] ] #[x]配 [a,b,c,d]表示:按a,b,c,d顺序索引第x行
'''x1=array([[ 7, 5, 4],
[11, 9, 8],
[ 3, 1, 0]]) ''' x2=x[ [[1,2,0]] , [[3],[1],[0]] ] #[a,b,c,d]配[x]表示:按a,b,c,d顺序索引第x列
'''x2=array([[ 7, 11, 3],
[ 5, 9, 1],
[ 4, 8, 0]])'''
#其中x1、x2互为转置矩阵 #第一维行为变独立( array([[1],[3]]), array([[2, 5]]) )
np.ix_([1,3],[2,5])
print(x[np.ix_([1,2,0],[3,1,0])])
'''[ [ 7 5 4]
[11 9 8]
[ 3 1 0] ]''' #以布尔数组np.array([True,False,...])形式可以过滤
x= np.array([1,2,3,4,5,6])
x[np.array([True,False,True,False,True,False])] #array([1, 3, 5])
x[x > 2] #array([3, 4, 5, 6])
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print(a[~np.isnan(a)]) #[1. 2. 3. 4. 5.],其中 ~ 取补运算符,按位取反.
#---------------------------------------------------------------------- #当运算中的 2 个数组的形状不同时,但要具备拉升可匹配性Broadcasting,numpy 会把数组自动拉升Broadcasting到相同,在进行元素运算 #numpy中运算函数也会遵循匹配性Broadcasting原则。 #对于一个多维数组a,如果a已经分配内存了,其转置a.T与a共享内存,且存储顺序也是一样的。
# 如果希望a.T与a存储顺序不同,可以需要重新分配内存:a.T.copy()。
# 或者控制遍历顺序:
# for x in np.nditer(a, order='F'):Fortran order,即是列序优先;
# for x in np.nditer(a.T, order='C'):C order,即是行序优先; #注意numpy中纬度是:011---轴0、1、2---轴Z、Y、X,新增的纬度放入轴索引0
#一维数据:0轴-X轴;二维数据:0轴-Y轴-列数据、1轴-X轴-行数据;... # Numpy数组操作------------------------------------------------------
# 修改数组形状:
# reshape 不改变数据的条件下修改形状
# flat 数组元素迭代器
# flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
# ravel 返回展开数组
# 翻转数组:
# transpose 对换数组的维度
# ndarray.T 和 self.transpose() 相同
# rollaxis 向后滚动指定的轴
# swapaxes 对换数组的两个轴
# 修改数组维度:
# broadcast 产生模仿广播的对象
# broadcast_to 将数组广播到新形状
# expand_dims 扩展数组的形状
# squeeze 从数组的形状中删除一维条目
# 连接数组
# concatenate 连接沿现有轴的数组序列
# stack 沿着新的轴加入一系列数组。
# hstack 水平堆叠序列中的数组(列方向)
# vstack 竖直堆叠序列中的数组(行方向)
# 分割数组
# split 将一个数组分割为多个子数组
# hsplit 将一个数组水平分割为多个子数组(按列)
# vsplit 将一个数组垂直分割为多个子数组(按行)
# 数组元素的添加与删除
# resize 返回指定形状的新数组
# append 将值添加到数组末尾
# insert 沿指定轴将值插入到指定下标之前
# delete 删掉某个轴的子数组,并返回删除后的新数组
# unique 查找数组内的唯一元素 #使用细节:
#flat数组元素迭代器
a = np.arange(9).reshape(3,3)
for row in a:print(row) #打印行
for element in a.flat:print (element) #打印元素 #可以先定义格式,再赋值
c=np.empty((4,3))
c.flat=[i for i in range(12)] #运算也遵循相同结构点对点,不同结构分配匹配原则
x = np.array([[7], [8], [9]])
x1= np.array([7, 8, 9])
y = np.array([4, 5, 6])
print(x+y) #结果不同,分别运算。
print(x1+y) #结构相同,一对一运算。
print(x*y) #结果不同,分别运算。
print(x1*y) #结构相同,一对一运算。 #numpy.swapaxes函数用于交换数组的两个轴
#注意numpy中纬度是:011---轴0、1、2---轴Z、Y、X,新增的纬度放入轴索引0
x=np.arange(8).reshape((2,2,2))
print(x)
print (np.swapaxes(x, 0, 2)) #np.expand_dims()原理
x=np.array([1,2,3,4])
print(x) #[1 2 3 4]
print(np.expand_dims(x,axis=0)) #[[1 2 3 4]] 相当于在第一层[]或第零层元素上加个[]
print(np.expand_dims(x,axis=1)) #[[1],[2],[3],[4]] 相当于在第二层[]或第一层元素上加个[]
y=np.array([[1,2],[3,4]])
print(y) #[[1 2],[3 4]]
print(np.expand_dims(y,axis=0)) #[[[1 2],[3 4]]] 相当于在第一层[]或第零层元素上加个[]
print(np.expand_dims(y,axis=1)) #[[[1 2]], [[3 4]]] 相当于在第二层[]或第一层元素上加个[]
print(np.expand_dims(y,axis=2)) #[[[1],[2]],[[3],[4]]] 相当于在第三层[]或第二层元素上加个[]
#--------------------------------------------------------------- # NumPy 字符串函数,用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作。
# add() 对两个数组的逐个字符串元素进行连接
# multiply() 返回按元素多重连接后的字符串
# center() 居中字符串
# capitalize() 将字符串第一个字母转换为大写
# title() 将字符串的每个单词的第一个字母转换为大写
# lower() 数组元素转换为小写
# upper() 数组元素转换为大写
# split() 指定分隔符对字符串进行分割,并返回数组列表
# splitlines() 返回元素中的行列表,以换行符分割
# strip() 移除元素开头或者结尾处的特定字符
# join() 通过指定分隔符来连接数组中的元素
# replace() 使用新字符串替换字符串中的所有子字符串
# decode() 数组元素依次调用str.decode
# encode() 数组元素依次调用str.encode #NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
#numpy.matlib库不在init内,需要import numpy.matlib # NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能
# dot 两个数组的点积,即元素对应相乘。
# vdot 两个向量的点积
# inner 两个数组的内积
# matmul 两个数组的矩阵积
# determinant 数组的行列式
# solve 求解线性矩阵方程
# inv 计算矩阵的乘法逆矩阵 # Numpy广播的规则可理解成:结构相同,点对点;结果不同,分别匹配。[]是最小单元,按最小单元匹配。
# Numpy中逻辑尽量用逻辑操作运算符&/|,少用关键字and/or
# Numpy的向量化操作比纯Python速度更快。
一、Numpy库与多维数组的更多相关文章
- python中numpy库ndarray多维数组的的运算:np.abs(x)、np.sqrt(x)、np.modf(x)等
numpy库提供非常便捷的数组运算,方便数据的处理. 1.数组与标量之间可直接进行运算 In [45]: aOut[45]:array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ ...
- NumPy之:ndarray多维数组操作
NumPy之:ndarray多维数组操作 目录 简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index wit ...
- NumPy 之 ndarray 多维数组初识
why 回顾我的数据分析入门, 最开始时SPSS+EXCEL,正好15年初是上大一下的时候, 因为统计学的还蛮好的, SPSS傻瓜式操作,上手挺方便,可渐渐地发现,使用软件的最不好的地方是不够灵活, ...
- numpy库的认识以及数组的创建
numpy库 numpy是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础.numpy十分高效,基于NumPy的算法要比纯Python快10到100倍(甚至 ...
- numpy基础教程--二维数组的转置
使用numpy库可以快速将一个二维数组进行转置,方法有三种 1.使用numpy包里面的transpose()可以快速将一个二维数组转置 2.使用.T属性快速转置 3.使用swapaxes(1, 0)方 ...
- Java题库——chapter7 多维数组
1)Which of the following statements are correct? 1) _______ A)char[ ][ ] charArray = {{'a', 'b'}, {' ...
- np.newaxis 为 numpy.ndarray(多维数组)增加一个轴
>> type(np.newaxis) NoneType np.newaxis 在使用和功能上等价于 None,其实就是 None 的一个别名. 1. np.newaxis 的实用 > ...
- numpy tricks(二)—— 删除多维数组的行或列
numpy.delete numpy 下的多维数组,如果要删除其中的某些行,或某些列,不可以用置空的方式,进行设置: A[1, :] = None, ⇒ 会将 A 中的第一行数据全部置为 Nan 1. ...
- Python数据分析numpy库
1.简介 Numpy库是进行数据分析的基础库,panda库就是基于Numpy库的,在计算多维数组与大型数组方面使用最广,还提供多个函数操作起来效率也高 2.Numpy库的安装 linux(Ubuntu ...
随机推荐
- Python 数字模块
Python中的数字模块 math模块 random模块 Decimal模块 - 没有损失的小数 Fraction模块 - 可以计算分数
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- TopCoder9915(期望dp)
1.还是逆向. 2.状态是还剩红i黑j张时的期望,这样从0,0往R,B推.注意因为是逆着的,所以到了某一步发现期望为负时直接f[i][j]归零,意义是这之后(在递推中算是这之前)的都不摸了,到这就停( ...
- select的type属性
select的type属性经常被我们所忽视,今天在看JQ的val钩子的时候,看到了这么一句话: one = elem.type === "select-one" || index ...
- 安卓新的联网方式 Volley的使用(一)加载图片与 json
最近刚接触安卓, 以前搞wp ,一对比起来 ,安卓怎么这么麻烦.联网必须要重新开一个线程才可以.而且加载网络图片也很麻烦...花了很久一直卡在快速滑动加载网络图片的listview上面 ,一直很纠结痛 ...
- springmvc写了方法无法访问
1.检查是否添加了@controller注解 2.在springmvc.xml里添加controller注解扫描 3.在applicationContext.xml里添加service扫描,给mapp ...
- 通用全局CSS样式
PC全局样式 *{padding:0;margin:0;} div,dl,dt,dd,form,h1,h2,h3,h4,h5,h6,img,ol,ul,li,table,th,td,p,span,a{ ...
- springmvc 实现原理与struts2原理的区别
spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. spring mvc是基于方法的设计,sturts2是基于类设计的. springmvc将ur ...
- wordpress注册收不到邮件
解决发送问题后又遇到个蛋疼的问题,点击激活邮件地址提示您的密码重设链接无效,请在下方请求新链接发现原来是显的没事的wordpress在激活链接前后都加了<>,而邮箱把后面的>当成是链 ...
- winfrom项目的打印
自己可以下一个PDF打印机(例如下载64位office虚拟打印文档) 首先要添加控件 1.添加打印的选项卡,并命名为打印 2.点击打印选项卡,右击鼠标,选择选择项 using System;using ...