数值计算库-Numpy的作用:
- Numpy用于在大型、多维数组(矩阵)上执行数值运算
- Numpy是Scipy/Pandas/scikit-learn等科学计算、数据分析、机器学习库的基础库,也是Python数据挖掘的基础
创建ndarray数组
import numpy as np
# 基本格式:alist = np.array(list/tuple)
alist = np.array([1,2,3]) # [1 2 3]
常见dtype类型
参数 | 解释 |
---|---|
np.bool | 布尔值 |
np.int | 整型 |
np.float | 浮点型 |
np.unicode_ | 字符串 |
# 可以在创造数组时指定dtype类型
alist = np.array([1,2,3], dtype=np.unicode_) # ['1' '2' '3']
ndarray数组对象属性
参数 | 解释 |
---|---|
.dtype | 对象元素类型 |
.size | 对象元素的个数,相当于.shape中的n*m的值 |
.shape | 轴,数组形状,对于矩阵,n行m列(不太理解) |
.ndim | 秩,数据维度 |
import numpy as np
# 0维数据
a0 = np.array(5)
print(a0, a0.ndim, a0.shape)
print("*"*20)
# 1维数据
a1 = np.array([1,2])
print(a1, a1.ndim, a1.shape)
print("*"*20)
# 2维数据
a2 = np.array([
[1,2],
[3,4]
])
print(a2, a2.ndim, a2.shape)
print("*"*20)
# 3维数据
a3 = np.array([
[
["小明", 90, 'male'],
["张三", 60, "female"]
],
[
["小明", 91, 'female'],
["张三", 90, "female"]
]
])
print(a3, a3.ndim, a3.shape)
"""
results:
5 0 ()
********************
[1 2] 1 (2,)
********************
[[1 2]
[3 4]] 2 (2, 2)
********************
[[['小明' '90' 'male']
['张三' '60' 'female']]
[['小明' '91' 'female']
['张三' '90' 'female']]] 3 (2, 2, 3)
"""
Numpy函数快速构造大数组(除arange外都是生成的浮点型)
- np.arange(n)
>>>np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- np.linspace()
根据起止数据等间距填充数据形成数组
>>>np.linspace(1,2,3) #3表示含3个元素
array([1. , 1.5, 2. ])
>>>np.linspace(1,2,3, endpoint=False) # endpoint表示生成的n个元素中是否包含终止元素
array([1. , 1.33333333, 1.66666667])
- full(shape, val)和full_like(alist, val)
根据格式生成数组
>>>alist
array([[1, 2],
[3, 4]])
>>>np.full(alist.shape, 'fu')
array([['fu', 'fu'],
['fu', 'fu']], dtype='<U2')
>>>np.full_like(alist, 100)
array([[100, 100],
[100, 100]])
>>>np.full_like(alist, 'bin') # 原格式为数字类型用full_like,要求val一定要能被int()强转
ValueError: invalid literal for int() with base 10: 'bin'
- np.ones(shape)和np.ones_like(ndarray)
用法与full和full_like相似,不需传val,生成的是浮点型的1组成的相同格式数组 - np.zeros(shape)和np.zeros_like(ndarray)
与上面的类似 - np.empty(shape)和np.empty_like(ndarray)
与上面的类似,创建新数组只分配内存空间,随意填充一些垃圾值 - np.eye(n)和np.identity(n)
这两个函数作用相同,创建一个正方的n*n单位矩阵,对角线为1,其余为0
>>>np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>>np.identity(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
- np.diag(list)
创建一个正方形矩阵,对角线为参数值,其余为0
>>>np.diag([1,2,3,4,5])
array([[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5]])
使用Numpy随机数创建特定数组
参数 | 解释 |
---|---|
.rand(d0,d1,..dn) | 创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1 |
.uniform(low,high,(size)) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
.randint(low,high,(shape)) | 从给定上下限范围选取随机数整数,范围是low,high,形状是shape |
.seed(s) | 随机数种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数 |
.randn(d0,d1,..dn) | 创建d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1 |
.normal(loc,scale,(size)) | 从指定正态分布中随机抽取样本,分布中心是loc(概率分布的均值),标准差是scale,形状是size |
# .rand() ---给定维度,生成的是浮点数
>>>np.random.rand(10)
array([0.96423391, 0.25408991, 0.20234839, 0.26309569, 0.3290563 ,
0.00834656, 0.43434389, 0.37981102, 0.12284219, 0.68015647])
>>>np.random.rand(2,3,4)
array([[[0.73811912, 0.58949586, 0.1477269 , 0.6509711 ],
[0.63117018, 0.69076537, 0.33748225, 0.29992466],
[0.35725206, 0.8762082 , 0.07229357, 0.74835445]],
[[0.95250543, 0.28038204, 0.79859217, 0.92027231],
[0.34419883, 0.02446916, 0.61344213, 0.00426297],
[0.25359085, 0.36004407, 0.2994331 , 0.3554107 ]]])
# .uniform() ---给定起始、结束、维度,生成的是浮点数
>>> np.random.uniform()
0.8525657129519096
>>> np.random.uniform(0,100)
98.5227237621942
>>> np.random.uniform(0,100,(3,4))
array([[79.54695296, 81.12288668, 49.82092111, 3.61948147],
[87.84763286, 14.1434305 , 74.09872995, 59.05728427],
[42.39094208, 99.49815838, 95.24305138, 49.42416064]])
"""这个结果看不太明白"""
>>> np.random.uniform((2,3,100,500))
array([ 1.86576847, 1.27743245, 76.32458977, 214.40451151])
# .randint() ---给定范围,维度,生成的是整数
>>> np.random.randint(100)
30
>>> np.random.randint(100,200)
111
>>> np.random.randint(100,200,(3,4,5))
array([[[135, 160, 180, 120, 113],
[176, 142, 135, 168, 187],
[165, 143, 191, 185, 190],
[144, 116, 171, 164, 101]],
[[136, 156, 199, 155, 151],
[110, 111, 116, 138, 174],
[151, 185, 193, 116, 138],
[171, 181, 195, 150, 143]],
[[130, 138, 173, 177, 113],
[111, 199, 170, 104, 140],
[172, 183, 155, 108, 101],
[168, 198, 193, 134, 112]]])
# .seed() ---设定随机数种子
>>> np.random.seed(10)
>>> np.random.rand(1,2,3) # 第一次
array([[[0.77132064, 0.02075195, 0.63364823],
[0.74880388, 0.49850701, 0.22479665]]])
>>> np.random.seed(10)
>>> np.random.rand(1,2,3) # 第二次
array([[[0.77132064, 0.02075195, 0.63364823],
[0.74880388, 0.49850701, 0.22479665]]])
# .randn() ---给定维度,标准正态分布(均值0,标准差1)
>>> np.random.randn(1,2,3)
array([[[-0.08112218, -0.52929608, 1.04618286],
[-1.41855603, -0.36249918, -0.12190569]]])
# .normal() ---给定均值/标准差/维度的正态分布
>>> np.random.normal(1.75, 0.2, (2,3))
array([[1.5048328 , 1.70564137, 2.01798526],
[1.75586194, 2.14707715, 2.03943312]])
# 限制生成的正态分布数组值在一定范围内
>>> z = np.random.normal(1.75, 0.2, 5)
>>> z
array([1.69247412, 1.47813789, 1.74039173, 1.65384253, 1.82555062])
>>> z[(z <= 1.77) & (z >= 1.73)]
array([1.74039173])
>>> z[(z <= 1.77) & (z >= 1.73)].shape
(1,)
# .round() ---结果四舍五入
>>> np.round(np.random.rand(2,3,4), 2)
array([[[0.51, 0.89, 0.3 , 0.4 ],
[0.79, 0.41, 0.18, 0.84],
[0.57, 0.06, 0.99, 0.23]],
[[0.61, 0.37, 0.8 , 0.63],
[0.82, 0.29, 0.27, 0.6 ],
[0.94, 0.71, 0.26, 0.12]]])
网友评论