NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。
这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。
便捷:
对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多。这是因为NumPy能够直接对数组和矩阵进行操作,可以省略很多循环语句,其众多的数学函数也会让编写代码的工作轻松许多。
性能:
NumPy中数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构(如嵌套的list容器)。其能够提升的性能是与数组中元素的数目成比例的。对于大型数组的运算,使用NumPy的确很有优势。对于TB级的大文件,NumPy使用内存映射文件来处理,以达到最优的数据读写性能。
高效:
NumPy的大部分代码都是用C语言写成的,这使得NumPy比纯Python代码高效得多。
当然,NumPy也有其不足之处,由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;此外,NumPy数组的通用性不及Python提供的list容器。因此,在科学计算之外的领域,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提供它自己的数据类型)。
数据类型 |
描述 |
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位浮点数(实数部分和虚数部分) |
import numpy as np
a = np.dtype(np.int_) # np.int64, np.float32 …
print(a)
int8, int16, int32,int64 可以由字符串’i1’, ‘i2’,’i4’, ‘i8’代替,其余的以此类推。
import numpy as np
a = np.dtype(‘i8’) # ’f8’, ‘i4’’c16’,’a30’(30个字符的字
# 符串), ‘>i4’…
print (a)
可以指明数据类型在内存中的字节序,’>’表示按大端的方式存储,’<’表示按小端的方式存储,’=’表示数据按硬件默认方式存储。大端或小端存储只影响数据在底层内存中存储时字节的存储顺序,在我们实际使用python进行科学计算时,一般不需要考虑该存储顺序。
import numpy as np
a = np.array([[1,2,3], [4, 5, 6]], dtype=int)
print(a.shape) # a.ndim, a.size, a.dtype
import numpy as np
a = np.array([(1,2,3), (4, 5, 6)], dtype=float)
print(a.shape) # a.ndim, a.size, a.dtype
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]]])
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)。
import numpy as np
a = np.ones((2,3))
b = np.zeros((2,3))
a*=3
b+=a
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 |
计算方阵的逆 |
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列表是不行的。
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() ?
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) #不等量分割