NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。比Python自身的List结构要高效的多,因为其将一维数组看作向量,二维数组看作矩阵来处理。
numpy基本操作
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
# 将数据类型应用于 ndarray 对象
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a)
################
[(10,) (20,) (30,)]
# 使用 range 函数创建列表对象
import numpy as np
list=range(5)
it=iter(list)
# 使用迭代器创建 ndarray
x=np.fromiter(it, dtype=float)
print(x)
可以用下面的方法替代
############## 法一 使用已有数组创建列表对象:
import numpy as np
x = [i for i in range(0,5)]
a = np.asarray(x,dtype=float)
print(a)
############## 法二 使用arange函数:
arange 函数返回的为 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
import numpy as np
x = np.arange(5)
print (x)
a[ , ] 逗号前面的是行,逗号后面的是列
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
print (a[...,1:]) # 第2列及剩下的所有元素
############################### 结果:
[2 4 5]
[3 4 5]
[[2 3]
[4 5]
[5 6]]
整数数组索引(上面的是切片来取数,这里用列表就是索引了)
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
################## 结果:(0,0)(1,1) (2,0)
[1 4 5]
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:' )
print (x)
//这里array函数中的索引要和上面的整数数组索引区分开
rows = np.array([[0,0],[3,3]]) //这里是创建了一个二维数组 [ [0,0] , [3,3] ]
cols = np.array([[0,2],[0,2]]) //这里是创建了一个二维数组 [ [0,2] , [0,2] ]
y = x[rows,cols] // 这样取出来的就是一个二维数组(行取一个,列取一个 (0,0)(0,2) ,到下一个数组了(3,0)(3,2)),上一个例子用一维取出来的就是一维数组
print ('这个数组的四个角元素是:')
print (y)
################## 结果:
我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这个数组的四个角元素是:
[[ 0 2]
[ 9 11]]
### b c 结果是一样的!
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
print(b)
print(c)
#################
[[5 6]
[8 9]]
[[5 6]
[8 9]]
### 默认按行来切
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]]) // 也可以传倒序索引 :print (x[[-4,-2,-1,-7]])
#####################
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
## 传入多个索引数组(要使用np.ix_)
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
输出结果为:
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
NumPy广播机制
np.ones((2,3)) 等效于 np.tile(1., (2,3))
np.zeros((2,3)) 等效于 np.tile(0., (2,3))
### 迭代访问 使用nditer函数
import numpy as np
a = np.arange(6).reshape(2,3)
for x in np.nditer(a.T):
print (x, end=", " )
for x in np.nditer(a.T.copy(order='C')):
print (x, end=", " )
print ('\n')
############# 结果为
0, 1, 2, 3, 4, 5,
0, 3, 1, 4, 2, 5,
矩阵的转置可以用这两种方法来实现
使用numpy的ndarray对象或者是直接用numpy对数组操作函数
numpy.ndarray.T 和 numpy.transpose:
import numpy as np
a = np.arange(12).reshape(3,4)
print (np.transpose(a))
print (a.T)
Numpy统计函数
numpy.amin()
用于计算数组中的元素沿指定轴的最小值。 axis = 1则为计算列方向最小值
numpy.amax()
用于计算数组中的元素沿指定轴的最大值。
用法示例: np.amin(a,0)
numpy.ptp()
函数计算数组中元素最大值与最小值的差(最大值 - 最小值)。
np.ptp(a, axis = 1)
numpy.percentile(a, q, axis)
50% 的分位数,就是 a 里排序之后的中位数
print (np.percentile(a, 50))
numpy.median()
函数用于计算数组 a 中元素的中位数(中值)
np.median(a, axis = 0)
numpy.mean()
函数返回数组中元素的算术平均值。 如果提供了轴,则沿其计算。
numpy.average()
函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。
加权平均值: 将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。
np.average([1,2,3, 4],weights = [4,3,2,1], returned = True)
numpy.std()
标准差是方差的算术平方根。
标准差公式如下:
std = sqrt(mean((x - x.mean())**2))
np.std([1,2,3,4])
var()
方差
np.var([1,2,3,4])
副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图
一般发生在:
1、numpy 的切片操作返回原数据的视图。
2、调用 ndarray 的 view() 函数产生一个视图。
副本
一般发生在:
Python 序列的切片操作,调用deepCopy()函数。
调用 ndarray 的 copy() 函数产生一个副本。
NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
numpy.matlib.zeros()
函数创建一个以 0 填充的矩阵。
numpy.matlib.identity()
函数返回给定大小的单位矩阵。
numpy.matlib.rand()
函数创建一个给定大小的矩阵,数据是随机填充的。
Numpy和线性代数有关的操作
NumPy中与Matplotlib的操作