python --- Numpy

Numpy是什么?

NumPyNumerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。

这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。

为什么使用Numpy?

便捷:

对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多。这是因为NumPy能够直接对数组和矩阵进行操作,可以省略很多循环语句,其众多的数学函数也会让编写代码的工作轻松许多。

性能:

NumPy中数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构(如嵌套的list容器)。其能够提升的性能是与数组中元素的数目成比例的。对于大型数组的运算,使用NumPy的确很有优势。对于TB级的大文件,NumPy使用内存映射文件来处理,以达到最优的数据读写性能。

高效:

NumPy的大部分代码都是用C语言写成的,这使得NumPy比纯Python代码高效得多。

    当然,NumPy也有其不足之处,由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;此外,NumPy数组的通用性不及Python提供的list容器。因此,在科学计算之外的领域,NumPy的优势也就不那么明显。

Numpy的安装:

  1. 官网安装。NumPy
  2. pip 安装。pip install numpy。
  3. LFD安装,针对windows用户http://www.lfd.uci.edu/~gohlke/pythonlibs/
  4. Anaconda安装(推荐),Anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便。下载地址:Free Download | Anaconda

Numpy 基础:

NumPy的主要对象是同种元素的多维数组。其中所有的元素都是一种类型。在NumPy中维度(dimensions)叫做(axes),轴的个数叫做(rank)。NumPy的数组类被称作 ndarray(矩阵也叫数组),通常被称作数组。

常用的ndarray对象属性有:

ndarray.ndim(数组轴的个数,轴的个数被称作秩),

ndarray.shape(数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n行m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性),

ndarray.size数组元素的总个数,等于shape属性中元组元素的乘积),

ndarray.dtype一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型)。

Numpy的数据类型:

数据类型

描述

bool_

布尔型数据类型(True 或者 False)

int_

默认的整数类型(类似于 C 语言中的 long,int32 或 int64)

intc

与 C 的 int 类型一样,一般是 int32 或 int 64

intp

用于索引的整数类型(类似于C的ssize_t,一般情况下仍然是int32或int64)

int8

字节(-128 to 127)

int16

整数(-32768 to 32767)

int32

整数(-2147483648 to 2147483647)

int64

整数(-9223372036854775808 to 9223372036854775807)

uint8

无符号整数(0 to 255)

uint16

无符号整数(0 to 65535)

uint32

无符号整数(0 to 4294967295)

uint64

无符号整数(0 to 18446744073709551615)

float_

float64类型的简写

float16

半精度浮点数,包括:1个符号位,5个指数位,10个尾数位

float32

单精度浮点数,包括:1个符号位,8个指数位,23个尾数位

float64

双精度浮点数,包括:1个符号位,11个指数位,52个尾数位

complex_

complex128类型的简写,即128位复数

complex64

复数,表示双32位浮点数(实数部分和虚数部分)

complex128

复数,表示双64位浮点数(实数部分和虚数部分)

例1:

import numpy as np
a = np.dtype(np.int_)     #  np.int64, np.float32 …
print(a) 
Numpy内置的特征码:
  1. 'b':布尔类型
  2. 'i':有符号整数
  3. 'u':无符号整数
  4. 'f':浮点数
  5. 'c':浮点型复数
  6. 'm':timedelta(时间间隔)
  7. 'M':datetime(日期时间)
  8. 'O':Python对象
  9. 'S','a':(byte-)字符串
  10. 'U':Unicode
  11. 'V':原始数据(void)

int8, int16, int32,int64 可以由字符串’i1’, ‘i2’,’i4’, ‘i8’代替,其余的以此类推。

例2:

import numpy as np
a = np.dtype(‘i8’)    # ’f8’, ‘i4’’c16’,’a30’(30个字符的字
# 符串), ‘>i4’…
print (a)

可以指明数据类型在内存中的字节序,’>’表示按大端的方式存储,’<’表示按小端的方式存储,’=’表示数据按硬件默认方式存储。大端或小端存储只影响数据在底层内存中存储时字节的存储顺序,在我们实际使用python进行科学计算时,一般不需要考虑该存储顺序。

创建数组并查看其属性:(理解)

  1.  用np.array从python列表和元组创建数组:

例3:

import numpy as np
a = np.array([[1,2,3], [4, 5, 6]], dtype=int)
print(a.shape)       #  a.ndim, a.size, a.dtype

例4:   

import numpy as np
a = np.array([(1,2,3), (4, 5, 6)], dtype=float)
print(a.shape)      #  a.ndim, a.size, a.dtype

例5:

import numpy as np
a = np.arange(10).reshape(2, 5) # 创建2行5列的二维数组,
                                # 也可以创建三维数组,
                                # a = np.arange(12).reshape(2,3,2)
print(a)

判断下列三维数组的shape:

a = np.array([[[1,2,3], [4, 5, 6], [7, 8, 9]]])

b = np.array([[[1,2,3]], [[4, 5, 6]], [[7, 8, 9]]])

例6:

import numpy as np
a = np.random.random(6)
b = np.random.rand(6)
c = np.random.randn(6)
print(a-b)                    # print(a+b),print(a*c) …
# 二维数组运算
d = np.random.random((2,3))
e = np.random.randn(2, 3)
f = np.random.rand(2,3)
print(d-e)                    # print(d+f),print(e*f) …
print(np.dot(a,b))          #复习矩阵乘法
print(a.dot(b))

# Numpy 随机数模块np.random.random, np.random.randn, np.random.rand的比较

(1)rand 生成均匀分布的伪随机数。分布在(0~1)之间

(2)randn 生成标准正态分布的伪随机数(均值为0,方差为1)。

例7:

import numpy as np
a = np.ones((2,3)) 
b = np.zeros((2,3))
a*=3
b+=a

例8:

import numpy as np 
a = np.arange(10)
np.where()

类型

说明

abs,fabs

计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fbas。

sqrt

计算各元素的平方根。相当于arr**0.5

sqare

计算各元素的平方。相当于arr**2

exp

计算各元素的e^x

log,log10,log2,log1p

分别为自然对数、底数为10的log、底数为2的log和log(1+x)

sign

计算各元素的正负号:1(正数)、0(零)、-1(负数)

ceil

计算各元素的ceiling值,即大于等于该值的最小整数

floor

计算各元素的floor值,即小于等于该值的最大整数

类型

说明

sum

对数组中全部或某轴向的元素求和。零长度的数组的sum为0。

mean

算术平均数。零长度的数组的mean为NaN。

std,var

分别为标准差和方差,自由度可调(默认为n)

min,max

最大值和最小值

argmin

分别为最大值和最小值的索引

cumsum

所有元素的累计和

cumprod

所有元素的累计积

类型

说明

rint

将各元素值四舍五入到最接近的整数,保留dtype。

modf

将数组的小数部分与整数部分以两个独立数组的形式返还。

isnan

返回一个表示"哪些值是NaN(这不是一个数字)"的布尔型数组

isfinite,isinf

分别返回一个表示"哪些元素是有限的(非inf,非NaN)"或"哪些元素是无穷的"的布尔型数组

cos,cosh,sin,sinh,tan,tanh

普通型或双曲型三角函数

arccos,arccosh,arcsin,

arcsinh,arctan,arctanh

反三角函数

logical_not

计算各元素not x的真值。相当于-arr。

类型

说明

add

将数组中对应的元素相加

subtract

从第一个数组中减去第二个数组中的元素

multiply

数组元素相乘

divide,floor_divide

除法或向下取整除法

power

对第一个数组中的元素A和第二个数组中对应位置的元素B,计算A^B

maximum,fmax

元素级的最大值计算。fmax将忽略NaN。

minimum,fmin

元素级的最小值计算。fmin将忽略NaN。

mod

元素级的求模计算

类型

说明

copysign

将第二个数组中的符号复制给第一个数组中的值

greater,greater_equal,less,

less_equal,equal,not_equal

执行元素级的比较,最终产生布尔型数组

logical_and,logical_or,

logical_xor

执行元素级的真值逻辑运算,最终产生布尔型数组

类型

说明

unique(x)

计算x中的唯一元素,并返回有序结果

intersect1d(x,y)

计算x和y的公共元素,并返回有序结果

union1d(x,y)

计算x和y的并集,并返回有序结果

in1d(x,y)

得到一个表述"x的元素是否包含于y"的布尔型数组

setdiff1d(x,y)

集合的差,即元素在x中且不在y中

setxor1d(x,y)

集合的异或,即存在于一个数组中但不同时存在于两个数组中的元素

类型

说明

diag

以一维数组的形式返回方阵的对角线(或非对角线元素),或将一维数组转换为方阵(非对角线元素为0)

dot

矩阵乘法

trace

计算对角线元素的和

det

计算矩阵行列式

eig

计算方阵的特征值和特征向量

inv

计算方阵的逆

例9:

import numpy as np
 a = arange(10)**3
a[2]
a[2:5]
a[:6:2] = -1000
a[ : :-1]
for i in a:
	print i**(1/3.)

# 多维数组的索引

b = np.arange(20).reshape(5,4)

b[2,3]

b[0:5, 1]

b[ : ,1]

b[1:3, : ]

#当少于轴数的索引被提供时,确失的索引被认为是整个切片

b[-1]    #相当于b[-1,:]

# b[i] 中括号中的表达式被当作 i 和一系列 : ,来代表剩下的轴。NumPy也允许你使用“点”像 b[i,...] 。

#点 (…)代表许多产生一个完整的索引元组必要的分号。如果x是

#秩为5的数组(即它有5个轴),那么:x[1,2,…] 等同于 x[1,2,:,:,:],x[…,3] 等同于 x[:,:,:,:,3],x[4,…,5,:] 等同 x[4,:,:,5,:].

三维数组的索引:

c = np.arange(12).reshape(2,3,2)

c[1]

c[2,1]    # 等价于c[2][1]

c[2,1,1]  # 等价于c[2][1][1]

# 通过数组索引

d = np.arange(10)**2

e = np.array ([3, 5, 6])

d[e] = ?

#练习, 用同样的方法在二维数组中操作。

# 通过布尔数组索引

f = np.arange(12).reshape(3, 4)

g = f>4

print(g)

f [g]

迭代多维数组是就第一个轴而言的:

h = np.arange(12).reshape(3,4)

for i in h:

   print(i)

如果想对每个数组中元素进行运算,我们可以使用flat属性,该属性是数组元素的一个迭代器:

for i in h.flat:

print(i)

补充:flatten()的用法:

   np.flatten()返回一个折叠成一维的数组。但是该函数只能适用于numpy对象,即array或者mat,普通的list列表是不行的。

例10:

import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])

a.flatten()
b = np.mat([[1,2,3], [4, 5, 6]])
b.flatten()
c = [[1,2,3], [4, 5, 6]]
c.flatten() ?

例11:

import numpy as np
#增加维度
a = np.arange(5)
a[:, np.newaxis]
a[np.newaxis, :]
np.tile([1,2], 2)
#合并
a = np.arange(10).reshape(2,5)
print(a.ravel())
print(a.resize(5,2))
b = np.arange(6).reshape(2,3)
c = np.ones((2,3))
d = np.hstack((b,c))              # hstack:horizontal stack 左右合并
e = np.vstack((b,c))              # vstack: vertical stack 上下合并          
f = np.column_stack((b,c))
g = np.row_stack((b,c))
h = np.stack((b, c), axis=1)      # 按行合并
i = np.stack((b,c), axis=0)       # 按列合并
j = np.concatenate ((b, c, c, b), axis=0)   #多个合并

#分割
k = np.hsplit(i, 2)
l = np.vsplit(i, 2)
m = np.split(i, 2, axis=0)
n = np.split(i, 2,axis=1)

o = np.array_split(np.arange(10),3)   #不等量分割

你可能感兴趣的:(python,python,numpy,开发语言)