Numpy基础
1、主要作用
进行科学计算(支持矩阵和ndarray数组对象),内存连续(访问效率高), 支持并行运算,有两种存储风格(F风格—列优先存储, C风格—行优先存储)
2、数组基础
import numpy as np
arr = np.array(....) # 创建简单的数组
arr.size # 4 数组中的元素个数
arr.itemsize # 数组中各个元素的占位大小
arr.dtype # 数组中元素的数据类型
arr.ndim # 数组的维度
arr.shape # 数组的形状, 元组形式返回, 返回的数据长度为数组的维度大小。
3、数组的创建
固定数组的创建
1、使用array直接创建
import numpy as np
np.array()
arr = np.array([1,2,3,4,5])
print('arr:\n',arr)
print('arr:\n',type(arr))
输出结果:
arr:
[1 2 3 4 5]
arr:
<class 'numpy.ndarray'>
2、使用arange来创建数组
# 参数1 : 开始位置 --包含开始位置
# 参数2: 结束位置---不包含结束位置
# 参数3: 步长
arr = np.arange(0, 10, 1)
arr = np.arange(10, dtype=np.float32) # 当开始位置为0,并且步长为1,那么可以只指定结束值即可!
# arr = np.arange(0, 10, 2)
print('arr\n', arr)
print('arr\n', type(arr)) # <class 'numpy.ndarray'>
3、使用linsapce来创建数组-----为等差数组
# 参数1:开始位置---包含开始位置
# 参数2 : 结束位置---包含结束位置
# 参数3 : 生成数组的元素的个数
# 参数 endpoint = True ---指的是包含结束位置
# 参数 dtype ---指定数据的类型
arr = np.linspace(0, 10, 6)
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
[ 0. 2. 4. 6. 8. 10.]
arr:
<class 'numpy.ndarray'>
4、使用logspace创建数组-----为等比数组
# 参数1 ---开始位置
# 参数2 ---结束位置
# 参数3 ---生成数组的元素的个数
# 注意:参数1、2都针对的是指数
# 参数 base --就是底数
arr = np.logspace(0, 2, 3, base=10)
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
[ 1. 10. 100.]
arr:
<class 'numpy.ndarray'>
5、使用zeros创建数组-----为全为0的数组
# 参数shape ---生成数组的形状--元组
# 参数dtype ---元素的数据类型
arr = np.zeros(shape=(2,3),dtype=np.int32)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[[0 0 0]
[0 0 0]]
arr:
<class 'numpy.ndarray'>
6、使用ones创建数组-----为全为1的数组
# 参数shape ---生成数组的形状--元组
# 参数dtype ---元素的数据类型
arr = np.ones(shape=(2,3),dtype=np.int32)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[[1 1 1]
[1 1 1]]
arr:
<class 'numpy.ndarray'>
7、使用diag来创建数组----类似于对角矩阵,但可以控制偏移量
参数—对角线上的元素!!
k-----用来控制偏移量的,正往右上角偏移,负则往左下角偏移
arr = np.diag([1, 2, 3, 4])
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
arr:
<class 'numpy.ndarray'>
添加 k参数
arr = np.diag([1, 2, 3, 4], k=1)
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
[[0 1 0 0 0]
[0 0 2 0 0]
[0 0 0 3 0]
[0 0 0 0 4]
[0 0 0 0 0]]
arr:
<class 'numpy.ndarray'>
8、使用eye创建数组----类似于单位矩阵
# 参数--传递一个值,表示生成一个 参数*参数的 类似于单位矩阵的数组
arr = np.eye(3)
print('arr:\n', arr)
print('arr:\n', type(arr))
print('arr:\n', arr.dtype)
结果:
arr:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
arr:
<class 'numpy.ndarray'>
arr:
float64
随机数组的创建
1、创建[0,1)内的均匀分布的数组
使用random.random创建
参数:可以是生成数组的元素个数 或者 是生成数组的形状!
arr = np.random.random(10) ------ 一维数组
arr = np.random.random((2,3))
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[0.66062123 0.78751191 0.54185441 0.32530977 0.47949264 0.12813448
0.22498117 0.55217461 0.60248759 0.41519065]
arr:
<class 'numpy.ndarray'>
使用random.rand创建数组
参数: 可以是生成数组的元素个数 或者 生成数组的行、列数!
arr = np.random.rand(10)
arr = np.random.rand(2,3,2)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[[[0.27498811 0.1288612 ]
[0.35329799 0.54618617]
[0.98577679 0.32164269]]
[[0.62686816 0.61702522]
[0.11239757 0.48891016]
[0.65602623 0.92886494]]]
arr:
<class 'numpy.ndarray'>
2、创建一个服从标准正态分布的数组random.randn
# 参数: 可以是生成数组的元素个数 或者 生成数组的行、列数!
# 创建一个服从标准正态分布的数组
arr = np.random.randn(10)
arr = np.random.randn(2,3)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[[ 0.49355101 -0.11087639 0.07618425]
[-0.2507126 1.22719261 0.57958796]]
arr:
<class 'numpy.ndarray'>
3、创建一个指定范围的随机整数数组random.randint
# 生成范围[low,high)
# size ---生成数组的形状!
arr = np.random.randint(low=0,high=10,size=(2,3))
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
[[3 5 9]
[3 6 6]]
arr:
<class 'numpy.ndarray'>
4、创建一个指定范围内的随机小数数组random.uniform
# 生成范围[low,high)
# 生成[low,high)的随机小数数组
arr = np.random.uniform(low=0.0, high=10.0, size=(2, 3))
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
[[7.25460971 5.36452214 5.09893388]
[2.31375316 2.20142422 6.91482905]]
arr:
<class 'numpy.ndarray'>
4、数组的索引
-
使用下标
-
使用切片—获取多个元素时使用
-
使用下标列表
arr = np.array([5, 6, 4, 3, 7, 8, 1, 2]) print('获取5、6、7元素:', arr[[0, 1, 4]]) 结果: 获取5、6、7元素: [5 6 7] # 注意: # 使用下标会降低维度,而使用切片不会降低维度! # 使用切片时,索引的元素的下标必须要有规律 -
bool数组索引
# bool数组----数组里面的值全部都是bool类型的,这样的数组称之为bool数组 # ---bool数组的长度必须和要索引的那个数组对应的维度上的值相等! # ---bool数组索引的时候,保留True,干掉False! arr = np.array([[1, 3, 7, 8], [9, 10, 12, 0], [19, 20, 18, 16], [6, 5, 4, 31]]) msk = np.array([0, 1, 2, 0], dtype=np.bool_) print('msk:\n', msk) # # 利用bool数组索引 print('bool数组索引:\n', arr[msk, :]) print('bool数组索引:\n', arr[:, msk]) ---------------------------------------------------------------------- 结果: msk: [False True True False] bool数组索引: [[ 9 10 12 0] [19 20 18 16]] bool数组索引: [[ 3 7] [10 12] [20 18] [ 5 4]]
5、数组的内部转换
1、修改形状-------前后元素个数不能发生改变
shape属性重新赋值
arr.shape = (2, 3)
print('arr:\n', arr)
结果:
arr:
[[0 1 2]
[3 4 5]]
reshape修改
arr = np.arange(0, 6, 1)
arr = arr.reshape((2, 3))
print('arr:\n', arr)
结果:
arr:
[[0 1 2]
[3 4 5]]
-------------------------------------------------------------------------
# -1 是占位的作用!
arr = arr.reshape((-1, 3))
print('arr:\n', arr)
结果:
arr:
[[0 1 2]
[3 4 5]]
将高维度 转化为 一维
arr = np.array([[1, 3, 7, 8],
[9, 10, 12, 0],
[19, 20, 18, 16],
[6, 5, 4, 31]])
print('arr:\n', arr) #-------都为对该arr操作
-------------------------------------------------------------------------
# 转化成一维数组
arr.shape = (-1,)
print('arr:\n', arr)
结果:
arr:
[ 1 3 7 8 9 10 12 0 19 20 18 16 6 5 4 31]
-------------------------------------------------------------------------
order = 'C' --表示行优先 F表示列优先
arr = arr.reshape((-1,), order='C')
print('arr:', arr)
结果:
arr: [ 1 3 7 8 9 10 12 0 19 20 18 16 6 5 4 31]
-------------------------------------------------------------------------
# flatten ravel --将数组展开成一维的!
# order = 'C' --表示行优先 F表示列优先
arr = arr.flatten(order='C')
print('arr:\n', arr)
结果:
arr:
[ 1 3 7 8 9 10 12 0 19 20 18 16 6 5 4 31]
arr = arr.flatten(order='F')
print('arr:\n', arr)
结果:
arr:
[ 1 9 19 6 3 10 20 5 7 12 18 4 8 0 16 31]
-------------------------------------------------------------------------
# 建议使用 ravel
arr = arr.ravel(order='C')
arr = arr.ravel(order='F')
print('arr:\n',arr)
2、修改数据类型
在创建数组的时候,通过dtype属性 指定数组的数据类型
# arr = np.ones((2, 2), dtype=np.float64)
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
结果:
arr:
[[1. 1.]
[1. 1.]]
arr:
float64
-------------------------------------------------------------------------
# # 如果想要修改数据类型
# # arr = np.int64(arr) # 强制修改是可行的,但是不建议!
# # print('arr:\n', arr)
# # print('arr:\n', arr.dtype)
结果:
arr:
[[1 1]
[1 1]]
arr:
int64
可以使用 astype来修改数据类型
# arr = arr.astype('int')
# print('arr:\n',arr)
# print('arr:\n',arr.dtype)
# arr = arr.astype(np.float32)
# print('arr:\n',arr)
# print('arr:\n',arr.dtype)
6、数组合并和拆分
合并:
#创建数组
import numpy as np
arr1 = np.arange(6).reshape((2, 3))
print('arr1:\n', arr1)
arr2 = np.zeros((2, 3), dtype=np.int32)
print('arr2:\n', arr2)
arr3 = np.array([1, 1, 1], dtype=np.int32)
print('arr3:\n', arr3)
结果:
arr1:
[[0 1 2]
[3 4 5]]
arr2:
[[0 0 0]
[0 0 0]]
arr3:
[1 1 1]
-
下方添加——垂直合并 ----
vstackres = np.vstack((arr1, arr2)) print('res:\n', res) 结果: res: [[0 1 2] [3 4 5] [0 0 0] [0 0 0]] -
在右侧添加——水平合并 ----
hstackres = np.hstack((arr1, arr2)) print('res:\n', res) 结果: ret: [[0 1 2 0 0 0] [3 4 5 0 0 0]] -
!!!注意:垂直合并要保证列数一致, 水平合并要保证行数一直否则会报错
y = np.hstack((arr1, arr2, arr3)) print('y:\n',y) # 错误的,因为行数不一致! 结果: ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 2 has 1 dimension(s) -
用
np.concatenate合并——必须保证维度是一样的,axis控制是行合并还是列合并ret = np.concatenate((arr1, arr2), axis=0) print('ret:\n',ret) 结果: ret: [[0 1 2] [3 4 5] [0 0 0] [0 0 0]] res = np.concatenate((arr1, arr2), axis=-1) print('res:\n',res) 结果: res: [[0 1 2 0 0 0] [3 4 5 0 0 0]]
拆分——拆分指定份数,必须能够平均拆分!否则会报错
# 创建数组
arr = np.arange(16).reshape((4,4))
print('arr:\n', arr)
结果:
arr:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
-
水平拆分——
hsplitret = np.hsplit(arr, 2) print('ret[0]:\n', ret[0]) print('ret[1]:\n', ret[1]) 结果: ret[0]: [[ 0 1] [ 4 5] [ 8 9] [12 13]] ret[1]: [[ 2 3] [ 6 7] [10 11] [14 15]] -
垂直拆分——
vsplitret = np.vsplit(arr, 2) print('ret:\n', ret[0]) print('ret:\n', ret[1]) 结果: ret: [[0 1 2 3] [4 5 6 7]] ret: [[ 8 9 10 11] [12 13 14 15]] -
若传递的是列表的话
eg:
ret = np.hsplit(arr, [1, 3]) # 会拆分成 :1, 1:3, 3: 三部分,相当于在这两个点进行切割 -
直接拆分——
np.split— 通过axis控制垂直还是水平ret = np.split(arr, [1, 3], axis=0) print('ret0:\n', ret) 结果: ret0: [array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])] ret = np.split(arr, [1, 3], axis=-1) print('ret-1:\n', ret) 结果: ret-1: [array([[ 0], [ 4], [ 8], [12]]), array([[ 1, 2], [ 5, 6], [ 9, 10], [13, 14]]), array([[ 3], [ 7], [11], [15]])] -
通过
索引切割获取(常用此方法)a = arr[:, :-1] # [行, 列] b = arr[:, -1:] print('a:\n', a) print('b:\n', b) 结果: a: [[ 0 1 2] [ 4 5 6] [ 8 9 10] [12 13 14]] b: [[ 3] [ 7] [11] [15]]
注意点:
1、获取列数
对于任何维度的数组,获取列数的话,都为数组形状返回的元组的最后一位数据
数组.shape[-1]
2、ones数组、zeros数组
ones数组和zeros数组主要用来占位
3、参数注意
-
random.random(参数)参数为int类型或者元组,可为多维数组 -
random.rand(参数),random.randn(参数)参数为
int类型或者行列数或多维数组的值,不能使用元组作为参数传递,用逗号隔开arr = np.random.rand((2,3,2)) print('arr:\n',arr) print('arr:\n',type(arr)) 结果: TypeError: 'tuple' object cannot be interpreted as an integer ----------------------------------------------------------------------arr = np.random.randn(10) arr = np.random.randn((2,3,2)) print('arr:\n',arr) print('arr:\n',type(arr)) 结果: TypeError: 'tuple' object cannot be interpreted as an integer

2404

被折叠的 条评论
为什么被折叠?



