NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
ndarray对象
ndarray 对象是用于存放同类型元素的多维数组。
- ndarray存储连续相同类型的数据,方便运算查找
- ndarray支持并行化运算
- 底层由C语言实现,无GIL限制,支持多线程
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
import numpy as np
a = np.array([1,2,3])
print (a)
#输出
[1, 2, 3]
ndarray属性
常用的就是形状和类型,可以在创建数组时指定
data1 = np.array(shape=(2,3), dtype= float)
基本操作
1. 生成数组
I. 生成0的数组
numpy.zeros(shape, dtype = float, order = 'C')
II. 生成1的数组
numpy.ones(shape, dtype = None, order = 'C')
III. 从现有数组生成
np.copy()
np.asarray()
np.array()
-
copy
和array
是浅拷贝,asarray
是深拷贝
IV. 生成固定范围的数组
-
np.linspace(a,b,c)
——生成[a,b]间的c个数 -
np.arange(a,b,c)
——生成[a,b)中步长为c的数
V. 生成随机数
均匀分布(每组可能性相等[low,high),size为输出样本数,元组/int类型) ——
np.random.uniform(low,high,size)
正态分布(波动程度、集中程度、稳定性等) ——
np.random.normal(low,high,size)
2. 切片索引
这个类似python列表的索引和切片操作,可自行尝试研究
import numpy as np
a = np.arange(10)
b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2
print(b)
#输出
[2,4,6]
3. 形状修改
I. ndarray.reshape(shape)
返回一个新的ndarray,但是不是行列直接转换,自动计算:ndarray.reshape(-1,b)
II. ndarray.resize(shape)
无返回值,直接更改原型
III. ndarray.T
,转置,行变成列,列变成行
4. 类型修改
I. ndarray.astype(type)
II. ndarray.tostring()
序列化到本地
5. 数组去重
I. np.unique(array)
II. set操作,先用flatten()将多维数组转成一维再用set操作
运算
1. 逻辑运算
- 布尔索引
将boolean值作为参数用作条件判断
stock_change = np.random.normal(0, 1, (8, 10))
stock_change = stock_change[0:5, 0:5]
#逻辑判断,如果大于0.5则标记为True,否则为False
print(stock_change >0.5)
print("******************************")
#BOOLEAN赋值,将满足条件的设置指定值
stock_change[stock_change > 0.5] = 1
print(stock_change)
#输出
[[False True False False False]
[False False False False False]
[False False False True False]
[ True False True False True]
[False True True True False]]
******************************
[[-0.6644082 1. 0.12243582 0.09599675 0.0798174 ]
[-2.62284685 -0.59904615 -0.27598282 0.20408988 0.37416402]
[-1.2548002 0.04883909 -0.69198354 1. 0.05396606]
[ 1. 0.26810907 1. -1.08110028 1. ]
[ 0.07104746 1. 1. 1. 0.0382673 ]]
- 通用判断函数
I. np.all(),条件都满足则返回True,否则False
np.all(stock_change[0:2, 0:5]>0 )
#输出
False
II. np.or(),一个条件满足则返回True,全为False才返回False
np.or(stock_change[0:2, 0:5]>0 )
#输出
True
- 三元运算符np.where(a,b,c)
a为条件(一组布尔值),b为返回True设置的值,c为返回False设置的值
np.where(array>0,1,0)
- 复合逻辑需要结合np.logical_and和np.logical_or使用
np.where(np.logical_and(array>0,array<2),1,0)
np.where(np.logical_or(array>0,array<2),1,0)
2. 统计运算
统计指标, min、max、mean(平均值)、median(中位数)、var(方差)、std(标准差)
I. np.argmax()最大数所在位置
- 注意是按行还是按列,指定axis轴——
np.argmax(array, axis=1)
II. 数组间运算
- 数组与数——直接对组内值进行运算,不同于python列表的运算
III. 数组与数组
并非任意数组间都能直接进行运算,需要满足广播机制
IV. 广播机制
当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有满足以下条件的数组间才能够进行运算:
- 维度相等
- shape(其中相对应的一个地方为1)
将两个矩阵从右向左依次排开(数字为每个维度所含元素个数),按照如上条件判断,最终运算后的shape结果值取对应值的较大值。
可运算:
不可运算:
3. 矩阵运算
矩阵(matrix),必须是二维的,但array不同,array可为多维
I. 二维数组
np.mat()
——将数组转化为矩阵
array = np.array([[10,20],[20,30],[30,40]])
print(type(array))
print("************")
mat = np.mat(array)
print(type(mat))
#输出
<class 'numpy.ndarray'>
************
<class 'numpy.matrixlib.defmatrix.matrix'>
II. 矩阵相乘
需要满足以下两点
第一个矩阵的列数=第二个矩阵的行数,形成:
(m,n)*(n,l) = (m,l)
-
运算规则:
-
矩阵乘法api
matmul
np,dot
- mat形式矩阵可直接相乘,ndarray形式矩阵需要用上述方法相乘,或者使用array1 @ array2方式
合并与分割
I.合并(axis值不确定的话运行验证一下即可)
- 水平合并
- np.hstack((a,b))
- concatenate((a,b), axis=1)
- 竖直合并
- np.vstack((a,b))
- concatenate((a,b), axis=0)
II. 分割
numpy.split(ary, indices_or_sections, axis=0)
IO操作
I. numpy读取
np.genfromtxt('1.csv', delimiter=',')
II. 缺失值&NAN
numpy在处理字符串以及处理缺失值方面不如pandas省事,当读取文本中出现float形式或者有缺失值时会出现NAN,可自行做替换或者其他处理。