NumPy
NumPy介绍
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
Numpy为python提供了快速的多维数组处理能力。用于数学计算,提供了数学函数,但往往用ndarray数据结构,ndarray是数据结构,n维数组,本身内核是C/C++,编程和运行速度快。
(numpy/scipy)官网 :https://www.scipy.org/
简要介绍
NumPy是高性能科学计算和数据分析的基础包,用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多,本身是由C语言开发。这个是很基础的扩展,其余的扩展都是以此为基础。数据结构为ndarray,一般有三种方式来创建。
通过类似工厂函数numpy内置函数生成:np.arange,np.linspace.....
快速入门:Quickstart tutorial
部分功能如下:
ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
用于集成C、C++、Fortran等语言编写的代码的工具。
百度百科
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵matrix)。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。
一个用python实现的科学计算包。包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
NumPy库简介
这两年Python特别火,在一些IT网站上转一圈各处都能看到关于Python的技术类文章,引用官方的说法 ,Python就是“一种解释型的、面向对象的、带有动态语义的高级程序设计语言”。Python是一种想让你在编程实现自己想法时感觉不那么碍手碍脚的程序设计语言。Python特点是开发快,语言简洁,可以花较少的代价实现想要的功能,并且编写的程序清晰易懂,比如豆瓣、国外视频网站youtube、社交分享网站Reddit、文件分享服务Dropbox就是使用Python开发的网站,如此看来Python在大规模使用方面应该没什么问题;Python从性能方面来看,有速度要求的话,还是用C++改写关键部分吧。Python在特定领域的表现还是很突出的,比如作为脚本语言、网络爬虫、科学算法等方面。我是因为搞深度学习开始接触Python的,之前学的C++,在遇见Python后简直打开了新世界的大门,码代码的幸福感简直爆棚啊。。。。。。下面开始正题
NumPy是使用Python进行科学计算的一个基本库。 其中包括:
用于集成C / C ++和Fortran代码的工具;
除了其明显的科学用途,NumPy也可以用作通用数据的高效多维容器。 可以定义任意数据类型。 这允许NumPy无缝,快速地与各种各样的数据库集成。
Array数组和矩阵的基本运算
numpy还是很强大的,这里把一些矩阵基本操作做一些整理,方便大家,也方便我自己码代码的时候查找。
有句话对于我这个初学者来说觉得还是挺符合的,翻书看视频浏览教程贴啊什么的,会发现很多知识点,一开始并不用非得记下都有些什么函数,问题是好像也记不住,学过去之后只要知道这个东西它都能实现什么些什么功能能干些什么事就够了,在你写程序的时候你需要实现什么,这时候再去查找就足够了,用着用着自然就记住了。犹记得那时候苦翻C++ Primer Plus那本书时的悲痛,学语言不用的话真是看后面忘前面。
犹记得那时候苦翻C++ Primer Plus那本书时的悲痛,学语言不用的话真是看后面忘前面。
函数库的导入
Copy import numpy #或者
import numpy as np
这里np
就是numpy
的一个别名。在下面的程序中就可以用np
来代替numpy
了。
array常用变量及参数
numpy.array 常用变量及参数
dtype变量,用来存放数据类型, 创建数组时可以同时指定。
shape变量, 存放数组的大小, 这人值是可变的, 只要确保无素个数不变 的情况下可以任意修改。(-1为自动适配, 保证个数不变)
reshape方法,创建一个改变了形状的数组,与原数组是内存共享的 ,即都指向同一块内存。
创建矩阵
直接创建矩阵array
首先需要创建数组才能对其进行其它操作,通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(如c):
Copy import numpy as np
a = np . array ([ 1 , 2 , 3 , 4 ])
b = np . array (( 5 , 6 , 7 , 8 ))
c = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
print (a)
print ( '---' )
print (b)
print ( '---' )
print (c)
# 输出
#[1 2 3 4]
#---
#[5 6 7 8]
#---
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
若导入numpy
用的是import numpy
命令,那么在创建数组的时候用a = numpy.array([1, 2, 3, 4])
的形式 若导入numpy
用的是import numpy as np
命令,那么用a = np.array([1, 2, 3, 4])
创建0矩阵zeros
Copy import numpy as np
a = np . zeros (( 3 , 4 )) # 创建3行4列的0矩阵
b = np . zeros (( 3 , 4 ), dtype = np.str) # 可以在创建的时候指定数据类型
print (a)
print (a.dtype)
print ( '---' )
print (b)
print (b.dtype)
创建1矩阵ones
Copy import numpy as np
a = np . ones (( 3 , 4 ), dtype = int ) # 创建3行4列的1矩阵
print (a)
print (a.dtype)
# 输出
#[[1 1 1 1]
# [1 1 1 1]
# [1 1 1 1]]
#int32
区间内按等差创建矩阵arange
左闭右开
Copy import numpy as np
a = np . arange ( 10 , 30 , 5 ) # 10开始到30,没加5生成一个元素
print (a)
# 输出
#[10 15 20 25]
# 可以通过修改shape属性改变维度,参考上文
b = np . arange ( 0 , 2 , 0.3 ) # 0开始到2,没加0.3生成一个元素
print (b)
# 输出
#[ 0. 0.3 0.6 0.9 1.2 1.5 1.8]
c = np . arange ( 12 ). reshape ( 3 , 4 ) # 从0开始每加1共生成12个元素,并通过reshape设定矩阵大小为3行4列
print (c)
# 输出
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
d = np . random . random (( 2 , 3 )) # 生成2行3列矩阵,元素为0-1之间的随机值
print (d)
# 输出
#[[ 0.83492169 0.76747417 0.3277655 ]
# [ 0.99115563 0.32029091 0.69754825]]
区间内按元素个数取值linspace
Copy import numpy as np
from numpy import pi
print (np. linspace ( 0 , 2 * pi, 11 )) # 0到2*pi,取11个值
#输出
#[ 0. 0.62831853 1.25663706 1.88495559 2.51327412 3.14159265
# 3.76991118 4.39822972 5.02654825 5.65486678 6.28318531]
print (np. linspace ( 0 , 10 , 11 )) # 0到10,取11个值
#输出
#[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
创建随机数组random
这里有详细的numpy.random的用法介绍:
为什么你用不好Numpy的random函数?
Copy import numpy as np
a = np . random . random ( 5 )
print (a)
#[ 0.01449445 0.61745786 0.47911107 0.80746168 0.48032829]
b = np . random . random ([ 2 , 3 ])
print (b)
#[[ 0.00194012 0.6861311 0.06081057]
# [ 0.1238706 0.48659479 0.76274877]]
矩阵拼接按行vstack
矩阵拼接按列hstack
Copy import numpy as np
a = np . floor ( 10 * np.random. random (( 2 , 2 )))
b = np . floor ( 10 * np.random. random (( 2 , 2 )))
print (a)
print ( '---' )
print (b)
print ( '---' )
print (np. vstack ((a, b))) # 按行拼接,也就是竖方向拼接
print ( '---' )
print (np. hstack ((a, b))) # 按列拼接,也就是横方向拼接
#输出:
#[[ 9. 4.]
# [ 4. 4.]]
#---
#[[ 8. 3.]
# [ 9. 8.]]
#---
#[[ 9. 4.]
# [ 4. 4.]
# [ 8. 3.]
# [ 9. 8.]]
#---
#[[ 9. 4. 8. 3.]
# [ 4. 4. 9. 8.]]
矩阵分割按列hsplit
Copy import numpy as np
a = np . floor ( 10 * np.random. random (( 2 , 6 )))
print (a)
print (np. hsplit (a, 3 )) # 按列分割,也就是横方向分割,参数a为要分割的矩阵,参数3为分成三份
print ( '---' )
print (np. hsplit (a, ( 2 , 3 , 5 ))) # 参数(3, 4)为在维度3前面也就是第4列前切一下,在维度4也就是第5列前面切一下
# 输出
#[[ 2. 9. 4. 6. 1. 9.]
# [ 7. 1. 7. 9. 3. 5.]]
#[array([[ 2., 9.],
# [ 7., 1.]]), array([[ 4., 6.],
# [ 7., 9.]]), array([[ 1., 9.],
# [ 3., 5.]])]
#---
#[array([[ 2., 9.],
# [ 7., 1.]]), array([[ 4.],
# [ 7.]]), array([[ 6., 1.],
# [ 9., 3.]]), array([[ 9.],
# [ 5.]])]
矩阵分割按行vsplit
Copy import numpy as np
a = np . floor ( 10 * np.random. random (( 6 , 2 )))
print (a)
print (np. vsplit (a, 3 )) # 按列分割,也就是横方向分割,参数a为要分割的矩阵,参数3为分成三份
print ( '---' )
print (np. vsplit (a, ( 2 , 3 , 5 ))) # 参数(3, 4)为在维度3前面也就是第4列前切一下,在维度4也就是第5列前面切一下
# 输出
#[[ 4. 3.]
# [ 9. 1.]
# [ 0. 0.]
# [ 8. 8.]
# [ 0. 2.]
# [ 5. 0.]]
#[array([[ 4., 3.],
# [ 9., 1.]]), array([[ 0., 0.],
# [ 8., 8.]]), array([[ 0., 2.],
# [ 5., 0.]])]
#---
#[array([[ 4., 3.],
# [ 9., 1.]]), array([[ 0., 0.]]), array([[ 8., 8.],
# [ 0., 2.]]), array([[ 5., 0.]])]
多重复制tile
Copy import numpy as np
a = np . array ([ 5 , 10 , 15 ])
print (a)
print ( '---' )
b = np . tile (a, ( 4 , 3 )) # 参数(4, 3)为按行复制4倍,按列复制3倍
print (b)
print (b.shape)
print ( type (b))
#输出
#[ 5 10 15]
#---
#[[ 5 10 15 5 10 15 5 10 15]
# [ 5 10 15 5 10 15 5 10 15]
# [ 5 10 15 5 10 15 5 10 15]
# [ 5 10 15 5 10 15 5 10 15]]
#(4, 9)
#<class 'numpy.ndarray'>
用reshape创建新数组
使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变:
Copy import numpy as np
a = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
print (a)
print ( '---' )
b = a . reshape (( 4 , - 1 ))
#b.shape = -1, 3
#b.shape = (4, 3)
#b.shape = 4, 3
print ( 'b = ' , b)
print (b.shape)
print ( 'a = ' , a)
# 输出
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
#---
#b = [[ 1 2 3]
# [ 4 4 5]
# [ 6 7 7]
# [ 8 9 10]]
#(4, 3)
#a = [[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
基本操作和运算
求和sum()
求最大值max()
求最小值min()
求平均值mean()
Copy import numpy as np
test1 = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
print (test1. sum ())
# 输出 225
print (test1. max ())
# 输出 45
print (test1. min ())
# 输出 5
print (test1. mean ())
# 输出 25.0
矩阵行求和sum(axis=1)
Copy import numpy as np
test1 = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
print (test1. sum (axis = 1 ))
# 输出 array([30, 75, 120])
矩阵列求和sum(axis=0)
Copy import numpy as np
test1 = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
peint (test1. sum (axis = 0 ))
# 输出 array([60, 75, 90])
元素求平方a2
Copy import numpy as np
a = np . arange ( 4 )
print (a)
print (a ** 2 )
# 输出 [0 1 2 3]
# [0 1 4 9]
元素求e的n次幂exp
元素开根号sqrt
Copy import numpy as np
test = np . arange ( 3 )
print (test)
print (np. exp (test)) #e的n次幂
print (np. sqrt (test)) #开根号
# 输出 [0 1 2]
# [1. 2.71828183 7.3890561]
# [0 1. 1.41421356]
向下取整floor
Copy import numpy as np
testRandom = 10 * np . random . random (( 2 , 3 ))
testFloor = np . floor (testRandom)
print (testRandom)
print (testFloor)
# 输出 [[ 4.1739405 3.61074364 0.96858834]
# [ 4.83959291 8.786262 0.74719657]]
# [[ 4. 3. 0.]
# [ 4. 8. 0.]]
平坦化数组ravel
Copy import numpy as np
test = np . array ([[ 2 , 3 , 4 ],[ 5 , 6 , 7 ]])
test . shape = ( 6 , 2 )
print (test)
print (test.T)
# 输出 [[2 3]
# [4 5]]
# [2 3 4 5]
查找并修改矩阵特定元素
例如下面代码中,x_data是我代码中的一个矩阵,但是矩阵数据中有缺失值是用?表示的,我要做一些数据处理,就需要把?换掉,比如换成0。(注:这里我换成了更简单的矩阵)
Copy import numpy as np
a = np . arange ( 5 )
print (a)
print ( '----' )
a [ a == 0 ] = 100
print (a)
# 输出
#[0 1 2 3 4]
#----
#[100 1 2 3 4]
Array数组的数据类型
关于数据类型:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
list类型是python自带的类型,下面的结构就是list类型:
Copy list1 = [ 1 , 2 , 3 , 4 , 5 ];
print (list1)
print ( type (list1))
#[1, 2, 3, 4, 5]
#<class 'list'>
array数组的数据类型有下面几种
Copy bool -- True , False
int -- int16 , int32 , int64
float -- float16 , float32 , float64
string -- string , unicode
查询数据类型dtype
Copy import numpy as np
a = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
print (a)
print (a.dtype)
print ( type (a))
# 输出
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
# int32
#<class 'numpy.ndarray'>
创建时指定元素类型
Copy import numpy as np
a = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
b = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]], dtype = 'str' )
print (a)
print ( "a.dtype = " , a.dtype)
print ( '---' )
print (b)
print ( "b.dtype = " , b.dtype)
# 输出
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
#a.dtype = int32
#---
#[['1' '2' '3' '4']
# ['4' '5' '6' '7']
# ['7' '8' '9' '10']]
#b.dtype = <U2 ???????这是什么鬼?为什么不是str?
转换数据类型astype
Copy import numpy as np
b = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]], dtype = 'str' )
print (b)
print ( "b.dtype = " , b.dtype)
b = b . astype ( int )
print (b)
print ( "b.dtype = " , b.dtype)
# 输出
#[['1' '2' '3' '4']
# ['4' '5' '6' '7']
# ['7' '8' '9' '10']]
#b.dtype = <U2
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
#b.dtype = int32
修改数组的shape
通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。下面的例子将数组b的shape改为(4, 3),从(3, 4)改为(4, 3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:
Copy import numpy as np
b = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
print (b)
print ( '---' )
b . shape = 4 , - 1 #当某个轴的元素为-1时,将根据数组元素的个数自动计算该轴的长度
#b.shape = -1, 3
#b.shape = (4, 3)
#b.shape = 4, 3
print (b)
print (b.shape)
# 输出
#[[ 1 2 3 4]
# [ 4 5 6 7]
# [ 7 8 9 10]]
#---
#[[ 1 2 3]
# [ 4 4 5]
# [ 6 7 7]
# [ 8 9 10]]
#(4, 3)
矩阵运算
矩阵乘法dot()
Copy import numpy as np
a = np . array ([[ 1 , 2 ],
[ 3 , 4 ]])
b = np . array ([[ 5 , 6 ],
[ 7 , 8 ]])
print (a * b) # 对应位置元素相乘
print (a. dot (b)) # 矩阵乘法
print (np. dot (a, b)) # 矩阵乘法,同上
# 输出 [[5 12]
# [21 32]]
# [[19 22]
# [43 50]]
# [[19 22]
# [43 50]]
矩阵转置T/transpose()
Copy import numpy as np
test = np . array ([[ 2 , 3 , 4 ],[ 5 , 6 , 7 ]])
test . shape = ( 3 , - 1 )
print (test)
print (test.T)
print (test. transpose ())
# 输出 [[2 3]
# [4 5]
# [6 7]]
# [[2 4 6]
# [3 5 7]]
#[[2 4 6]
# [3 5 7]]
求特征值和特征向量eig()
Copy import numpy as np
import numpy . linalg as nplg
a = np . array ([[ 1 , 0 ],[ 2 , 3 ]])
print (a)
print (nplg. eig (a))
eigValues = np . array ([ 3 ., 1 .])
eigVectors = np . array ([[ 0 . , 0.70710678 ],
[ 1 . , - 0.70710678 ]])
print (a. dot (eigVectors[:, 0 ]))
print (eigValues[ 0 ] * eigVectors[:, 0 ])
print (a. dot (eigVectors[:, 1 ]))
print (eigValues[ 1 ] * eigVectors[:, 1 ])
求矩阵的迹trace()
Copy import numpy as np
test = np . array ([[ 2 , 3 , 4 ],[ 5 , 6 , 7 ],[ 8 , 9 , 10 ]])
print (test)
print (test. trace ())
print (np. trace (test))
# 输出
#[[ 2 3 4]
# [ 5 6 7]
# [ 8 9 10]]
#18
#18
复制
共享内存=
a和b共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组或矩阵的内容:
Copy import numpy as np
a = np . arange ( 12 )
b = a
print (a)
print (b)
print (b is a) # 判断b是a?
# 输出 [ 0 1 2 3 4 5 6 7 8 9 10 11]
# [ 0 1 2 3 4 5 6 7 8 9 10 11]
# True
b . shape = 3 , 4
b [ 0 , 0 ] = 100 ;
print (a.shape)
# 输出 (3, 4)
print (a)
# 输出[[100 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print ( id (a)) #内存地址
print ( id (b))
# 输出 201372576
# 201372576
浅复制view()
不是同一地址,但是会被改变
Copy # The view method creates a new array object that looks at the same data.
import numpy as np
a = np . arange ( 12 )
b = a . view () # b是新创建出来的数组,但是b和a共享数据
print (b is a) # 判断b是a?
# 输出 False
print (b)
# 输出 [ 0 1 2 3 4 5 6 7 8 9 10 11]
b . shape = 2 , 6 # 改变b的shape,a的shape不会受影响
print (a.shape)
print (b)
# 输出 (12,)
#[[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]]
b [ 0 , 4 ] = 1234 # 改变b第1行第5列元素为1234,a对应位置元素受到影响
print (b)
# 输出 [[ 0 1 2 3 1234 5]
# [ 6 7 8 9 10 11]]
print (a)
# 输出 [ 0 1 2 3 1234 5 6 7 8 9 10 11]
深复制copy()
不是同一地址,也不会被改变
Copy # The copy method makes a complete copy of the array and its data.
import numpy as np
a = np . arange ( 12 )
a . shape = 3 , 4
a [ 1 , 0 ] = 1234
c = a . copy ()
print (c is a)
c [ 0 , 0 ] = 9999 # 改变c元素的值,不会影响a的元素
print (c)
print (a)
# 输出
#False
#[[9999 1 2 3]
# [1234 5 6 7]
# [ 8 9 10 11]]
#[[ 0 1 2 3]
# [1234 5 6 7]
# [ 8 9 10 11]]
查询矩阵的维度个数形状等
查询维度ndim
Copy import numpy as np
a = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
print (a.ndim)
#输出
#2
查询元素个数size
Copy import numpy as np
a = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
print (a.size)
# 输出 9
查询矩阵的大小shape
Copy import numpy as np
a = np . array ([ 1 , 2 , 3 , 4 ])
b = np . array ([[ 1 , 2 , 3 , 4 ], [ 4 , 5 , 6 , 7 ], [ 7 , 8 , 9 , 10 ]])
print (a.shape)
print ( '---' )
print (b.shape)
# 输出
#(4,)
#---
#(3, 4)
(4, )shape有一个元素即为一维数组,数组中有4个元素 (3, 4)shape有两个元素即为二维数组,数组为3行4列
判断==
利用==判断数组或矩阵中是否存在某个值
Copy import numpy as np
test = np . array ([ 5 , 10 , 15 , 20 ])
print (test >= 15 )
#[False False True True]
print (test * (test >= 15 ) + 15 )
#[15 15 30 35]
将判断结果赋给某个变量
Copy import numpy as np
test = np . array ([[ 5 , 10 , 15 ],
[ 20 , 25 , 30 ],
[ 35 , 40 , 45 ]])
# 判断test中第三列等于30的元素
secondColumn30 = (test [:, 2 ] == 30 )
print (secondColumn30)
# 取secondColumn30为True的行,打印
print (test[secondColumn30,:])
# 输出
#[False True False]
#[[20 25 30]]
一次判断多个条件
Copy import numpy as np
test = np . array ([ 5 , 10 , 15 , 20 ])
equalTo15And20 = (test == 15 ) & (test == 20 ) #同时等于15又等于20的元素,显然是不存在的
print (equalTo15And20)
#[False False False False]
equalTo15Or20 = (test == 15 ) | (test == 20 )
print (equalTo15Or20) #等于15或者等于20的元素
#[False False True True]
test [ equalTo15Or20 ] = 100
print (test)
#[ 5 10 100 100]
排序和索引
排序sort
Copy import numpy as np
a = np . array ([[ 4 , 3 , 5 ,],[ 1 , 2 , 1 ]])
print (a)
#[[4 3 5]
# [1 2 1]]
b = np . sort (a, axis = 1 ) # 对a按每行中元素从小到大排序
print (b)
#[[3 4 5]
# [1 1 2]]
c = a . copy () # 深拷贝
c . sort (axis = 0 )
print (c)
#[[1 2 1]
# [4 3 5]]
print (a) # a没有随着c变化
对单行数组进行排序的另外一种方法
Copy import numpy as np
a = np . array ([ 4 , 3 , 1 , 2 ])
b = np . argsort (a) # 求a从小到大排序的坐标
print (b)
print (a[b]) # 按求出来的坐标顺序排序
print (a[np. argsort (a)])
按行或按列找到最大值的索引argmax
Copy import numpy as np
data = np . sin (np. arange ( 20 )). reshape ( 5 , 4 )
print (data)
ind = data . argmax (axis = 0 ) # 按列得到每一列中最大元素的索引,axis=1为按行
print (ind)
data_max = data [ ind , range (data.shape[ 1 ])] # 将最大值取出来
print (data_max)
print (data. max (axis = 0 )) #也可以直接取最大值
数据归一化
Copy import numpy as np
a = 10 * np . random . random (( 5 , 5 ))
b = a . copy ()
print (a)
print ( "---" )
amin , amax = a . min (), a . max ()
print (amin, amax)
print ( "---" )
a = (a - amin) / (amax - amin)
print (a)
print ( "---" )
b = (b - b . min () ) / (b . max () - b . min () )
print (b)
# 输出
#[[ 7.33412218 7.62784714 7.06761515 6.56230239 3.76404535]
# [ 2.68197834 6.02335055 4.67169946 5.08454875 6.97170333]
# [ 4.02393841 3.9723266 1.82841784 7.6049149 0.38845819]
# [ 6.55672442 1.40986757 1.14657213 3.0356768 9.55024583]
# [ 1.06007416 1.23600072 0.97610622 8.8232397 0.39996053]]
#---
#0.38845818848 9.5502458299
#---
#[[ 0.75811231 0.7901721 0.72902333 0.67386895 0.36844198]
# [ 0.25033544 0.61504289 0.46751152 0.51257361 0.71855465]
# [ 0.39680905 0.39117567 0.15717016 0.78766907 0. ]
# [ 0.67326012 0.11148582 0.08274738 0.28894128 1. ]
# [ 0.07330622 0.09250842 0.0641412 0.920648 0.00125547]]
#---
#[[ 0.75811231 0.7901721 0.72902333 0.67386895 0.36844198]
# [ 0.25033544 0.61504289 0.46751152 0.51257361 0.71855465]
# [ 0.39680905 0.39117567 0.15717016 0.78766907 0. ]
# [ 0.67326012 0.11148582 0.08274738 0.28894128 1. ]
# [ 0.07330622 0.09250842 0.0641412 0.920648 0.00125547]]
最简洁的NumPy大纲
NumPy函数和属性
NumPy类型
numpy常用函数
NumPy.ndarray函数和属性
ndarray属性
ndarray函数
ndarray索引/切片方式
NumPy.random函数
NumPy.linalg函数
参考资料
NumPy介绍就是复制自这里。
Array数组和矩阵的基本运算都是复制或改编自这里。
最简洁的NumPy大纲都是复制自这里。
===
搭建模型第一步:你需要预习的NumPy基础都在这了
图解NumPy,这是理解数组最形象的一份教程了