numpy如何使用,,numpy介绍创建n


numpy介绍

创建numpy的数组

np.array()

传入一个列表, 返回一个数组

li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]arr = np.array(li)print(type(arr), arr)# <class ‘numpy.ndarray‘> [0 1 2 3 4 5 6 7 8 9]

np.arange(10)

类似于python中的range

arr = np.arange(10)print(type(arr), arr)<class ‘numpy.ndarray‘> [0 1 2 3 4 5 6 7 8 9]# 和python的range类型, 顾头不顾尾, 支持步长, 和python的range的区别在于, 起始值和步长支持小数arr = np.arange(1.2, 10.5, 0.5)print(type(arr), arr)# <class ‘numpy.ndarray‘> [ 1.2  1.7  2.2  2.7  3.2  3.7  4.2  4.7  5.2  5.7  6.2  6.7  7.2  7.7 8.2  8.7  9.2  9.7 10.2]

拓展: 将一维数据变成多维数组

前提保证, reshape()中的行和列相乘等于数组中的全部元素的个数

将一维数组转换成二维数组

arr = np.arange(0, 15).reshape(3, 5)print(arr)# [[ 0  1  2  3  4]#  [ 5  6  7  8  9]#  [10 11 12 13 14]]

将一维数组转换成三维数组

arr = np.arange(30).reshape(3, 2, 5)print(arr)# [[[ 0  1  2  3  4]#   [ 5  6  7  8  9]]##  [[10 11 12 13 14]#   [15 16 17 18 19]]##  [[20 21 22 23 24]#   [25 26 27 28 29]]]# 三维数组可以只给出两个数值, 另外一个用-1代替, 自动求剩下一个一个应该是多少# 比如:arr = np.arange(30).reshape(3, 2, -1)  会自动求出-1位置的数应该是6

np.linspace(0, 10, 5)

把0到10范围的数分成长度为5的数组, 保证每个数之间的差是相等的, 前包后也包

arr = np.linspace(0, 10, 5)print(type(arr), arr)# <class ‘numpy.ndarray‘> [ 0.   2.5  5.   7.5 10. ]

np.zeros(10)

创建全0的数组

arr = np.zeros(10)print(arr)# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]# 默认是float类型, 可以指定dtype, 可以指定创建几维的数据传一个元祖, 比如np.zeros(3,2,5), 就是创建一个3页2行5列的全0数组

np.ones(10)

创建全1的数组

arr = np.ones(10)print(arr)# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]# 默认使用float类型, 可以指定dtype, 可以指定创建几维的数据传一个元祖, 比如np.ones(3,2,5), 就是创建一个3页2行5列的全1数组

np.empty(10)

创建元素为随机的数组

# np.empty(10)的意义: 向内存要一个长度为10的内存, 并不进行赋值, 内存中原本的数据是什么就是什么, 之后可以对这个里面的值进行覆盖, 效率相对高一点arr = np.empty(10)print(arr)# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

np.eye(5)

创建单位矩阵, 方形的, 主对角线为1

arr = np.eye(5)  # 类似于np.identity(5)print(arr)# [[1. 0. 0. 0. 0.]#  [0. 1. 0. 0. 0.]#  [0. 0. 1. 0. 0.]#  [0. 0. 0. 1. 0.]#  [0. 0. 0. 0. 1.]]

索引切片

数组索引切片的特点: python的切片会产生新的数据, 修改新数据不会影响元数据
但是在数组中却不是这样的, 切片只是在元数据上做标记, 记录3:10这一段数据B可以拿到, 当对B进行修改时
元数据也会跟着变化, 这样做的目的就是节省时间和空间, 当数据较大时, 对数据进行切片比较快
对切片后的数据使用copy()可以进行拷贝, 修改数据不会再影响元数据
one_arr[0:5].copy()

普通索引

一维数组普通索引

one_arr = np.arange(10)print(one_arr)# [0 1 2 3 4 5 6 7 8 9]# 取前5个print(one_arr[0:5])# [0 1 2 3 4]

二维数组普通索引

two_arr = np.arange(15).reshape(3, 5)print(two_arr)# [[ 0  1  2  3  4]#  [ 5  6  7  8  9]#  [10 11 12 13 14]]

1. 取到第二行第三列的那个数

print(two_arr[2, 3])# 13

2. 取第一行

print(two_arr[0,])# two_arr[行: 列]# [0 1 2 3 4]

3. 取第一列

print(two_arr[0:,0])    # 所有的行0:    第一列0

4. 从中间去一个长方形

print(two_arr[0:2, 1:4])    # 切片是前包后不包的# [[1 2 3]#  [6 7 8]]

布尔型索引

1. 问题: 给出一个数组, 选出数组中所有大于5的数
python列表的做法

li = [random.randint(1, 10) for n in range(10)]# python列表的做法# res = list(filter(lambda x: x > 5, li))# print(res)


数组的做法

arr = np.array(li)print(arr[arr > 5])# 为什么这样写?# 先看看arr > 5的结果是什么print(arr > 5)# [ True  True  True  True False False  True  True  True  True]# 返回一个全是布尔的数组# 将5和原数组中的值进行比较返回布尔值# 返回使用这些布尔值进行取值, 将对应位置上是True的值取出了# arr[ True  True  True  True False False  True  True  True  True]# 这样就把结果取出来了

2. 问题: 给出一个数组, 选出所有大于5, 并且是偶数的数

print(arr[(arr > 5) & (arr % 2 == 0)])# 两个条件, 当两个条件都是True时才是True# 两个条件先分别计算, 得出两个全是布尔值的数组, 然后两个数组进行 & 计算, 在使用得出的结果取原数组中取值# 注意 and    和   & 的区别# and: 是python的关键字# &: 是运算符# 在这里要使用运算符

3. 问题: 给出一个数组, 选出所有除了大于5以外的数

print(arr[~(arr > 5)])# 找出大于5的, 然后使用 ~ 取反

4. 问题: 给出一个数组, 计算该数组中大于5的数字占的比重

print((arr[arr > 5]).size / arr.size)# 计算出大于5的数量, 然后除以全部的数量

花式索引

给出一个数据取出索引为奇数的数值

一维数组

arr = np.arange(10)print(arr[[1, 3, 5, 7, 9]])# 索引取值使用一个列表, 会取值和该列表值对应的索引位置的值, 保证列表中的元素都能作为索引, 不大于大最大索引# [1 3 5 7 9]

二维数组

# 使用花式索引是, 行列不能同时使用花式索引, 例如print(arr[[1, 2], [0, 1]])arr = np.arange(15).reshape(3, 5)print(arr)# [[ 0  1  2  3  4]#  [ 5  6  7  8  9]#  [10 11 12 13 14]]# print(arr[[1, 2], :][:, [0, 1]])# [[ 5  6]#  [10 11]]

通用函数

np.abs(arr) 绝对值

arr = np.arange(-5, 10).reshape(3, 5)print(arr)# [[-5 -4 -3 -2 -1]#  [ 0  1  2  3  4]#  [ 5  6  7  8  9]]print(np.abs(arr))# [[5 4 3 2 1]#  [0 1 2 3 4]#  [5 6 7 8 9]]

np.sqrt(arr) 开根号

arr = np.arange(1, 16).reshape(3, 5)print(np.sqrt(arr))# [[1.         1.41421356 1.73205081 2.         2.23606798]#  [2.44948974 2.64575131 2.82842712 3.         3.16227766]#  [3.31662479 3.46410162 3.60555128 3.74165739 3.87298335]]

np.exp() 指数

arr = np.arange(1, 16).reshape(3, 5)print(np.exp(arr))# [[2.71828183e+00 7.38905610e+00 2.00855369e+01 5.45981500e+01#   1.48413159e+02]#  [4.03428793e+02 1.09663316e+03 2.98095799e+03 8.10308393e+03#   2.20264658e+04]#  [5.98741417e+04 1.62754791e+05 4.42413392e+05 1.20260428e+06#   3.26901737e+06]]

取整

arr = np.array([3.4, 3.3, 4.6, 5.0])print(np.ceil(arr))  # 向上取整  4.5取5print(np.floor(arr))  # 向下取整  4.5取4print(np.trunc(arr))  # 向0取整print(np.rint(arr))  # 四舍五入取整

np.array() 将数组变成整数部分和小数部分两个数组

将数据分成两个数组, 一个是整数部分, 一个是小数部分, 都会带着各自的符号

arr = np.array([-3.4, 3.3, -4.6, 5.0])print(np.modf(arr)) # (array([-0.4,  0.3, -0.6,  0. ]), array([-3.,  3., -4.,  5.]))



numpy如何使用

评论关闭