numpy:开源的python科学计算模块,用于数据快速处理;
numpy支持矩阵与数组操作,计算速度快,是Python中科学计算的基础库;
numpy优点:
import numpy as np
values = np.array([1,2,3,4,5])
print(values)
print(type(values))
[1 2 3 4 5]
numpy安装:
- numpy官方文档:https://numpy.org/doc/ (https://numpy.org/doc/)
- numpy源码:https://github.com/numpy/numpy (https://github.com/numpy/numpy)
array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
参数 | 说明 |
---|---|
objec | 类似数组对象,例如:序列,range对象等 |
dtype | 元素类型 |
order | 数据内存排列形式 |
ndmin | 指定维度 |
#一维ndarray
print(np.array([1,2,3]))
#二维ndarray,元素类型为float32
print(np.array([1,2,3], dtype='f' ,ndmin=2))
[1 2 3]
[[1. 2. 3.]]
属性 | 说明 |
---|---|
.ndim | 秩 |
.shape | 维度 |
.size | 元素数量 |
.dtype | 元素类型 |
nd = np.array([1,2,3], ndmin=2)
print(f'ndim:{nd.ndim}') # 秩
print(f'shape:{nd.shape}') #维度
print(f'size:{nd.size}') #元素数量
print(f'dtype:{nd.dtype}') #元素类型
ndim:2
shape:(1, 3)
size:3
dtype:int32
方法 | 说明 |
---|---|
np.zeros(shape, dtype=float, order=‘C’) | 根据指定shape创建默认值为0的ndarray对象 |
np.empty(shape, dtype=float, order=‘C’) | 根据指定shape创建默认值为随机数的ndarray对象 |
np.ones(shape, dtype=float, order=‘C’) | 根据指定shape创建默认值为1的ndarray对象 |
np.full(shape, fill_value, dtype=None, order=‘C’) | 根据指定shape创建默认值为fill_value的ndarray对象 |
np.arange([start,] stop[, step,], dtype=None) | 类似于range,返回ndarray对象 |
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0,) | 根据给定起始值与数量,返回ndarray对象 |
np.zeros_like/empty_like/ones_like(a, dtype=None, order=‘K’, subok=True) | 根据给定array返回相同形状的ndarray对象 |
#一维
a = np.zeros(10)
print('zeros:\n',a)
#二维
a = np.ones((2,10))
print('ones:\n',a)
#根据指定数据形状
b = np.empty_like(a)
print('empty_like:\n',b)
#arange:
a = np.arange(0,20, 2)
print('arange:\n',a)
zeros:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
ones:
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
empty_like:
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
arange:
[ 0 2 4 6 8 10 12 14 16 18]
方法 | 说明 |
---|---|
np.random.rand(d0, d1, …, dn) | 根据给定形状产生随机值 |
np.random.randint(low, high=None, size=None, dtype=‘l’) | 根据指定值范围产生整数 |
# np.radom相关方法
#根据指定形状产生随机值
print("random.rand:\n", np.random.rand(2,3))
#根据指定形状产生指定范围随机值
print('random.randint:\n', np.random.randint(10, 20, size=(2,10)))
random.rand:
[[0.22869702 0.81646748 0.14623549]
[0.78226625 0.56383522 0.76761393]]
random.randint:
[[16 19 12 18 18 19 10 15 16 18]
[15 18 15 14 14 10 19 10 19 13]]
array.reshape(shape, order='C')
作用:调整array的新装,返回新的ndarray对象
# reshape方法:作用:调整array的新装,返回新的ndarray对象
a = np.arange(10)
b = a.reshape(2,5)
print('a.reshape(2,5):\n',b)
print('b.reshape(10):\n', b.reshape(10))
a.reshape(2,5):
[[0 1 2 3 4]
[5 6 7 8 9]]
b.reshape(10):
[0 1 2 3 4 5 6 7 8 9]
理解下order中的C与F:
a = [[1,2],[3,4]]
a[0][0],a[0][1],a[1][0],a[1][1]
a[0][0],a[1][0],a[0][1],a[1][1]
示例:
a = np.arange(10)
b = a.reshape(2,5)
print('b:\n', b)
c = b.reshape(10, order='C')
d = b.reshape(10, order='F')
print('c:\n',c)
print('d:\n',d)
b:
[[0 1 2 3 4]
[5 6 7 8 9]]
c:
[0 1 2 3 4 5 6 7 8 9]
d:
[0 5 1 6 2 7 3 8 4 9]
a = np.arange(10)
方法 | 说明 |
---|---|
a.tolist() | 转成列表 |
a.tostring(order=‘C’) | 转成bytes |
a.tobytes(order=‘C’) | 转成bytes |
a.tofile(fid, sep=“”, format=“%s”) | 保存到文件,fid:打开文件或者路径 |
# ndarray对象转其他数据结构
a = np.arange(10)
print(a.tolist())
print(a.tobytes())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00'
常用数据类型:
类型 | 类型代码 | 说明 |
---|---|---|
int8/16/32/64 | i1/i2/i4/i8 | 有符号8/16/32/64位整数 |
uint8/16/32/64 | u1/u2/u4/u8 | 无有符号8/16/32/64位整数 |
a = np.array([0,1,2,3])
a
array([0, 1, 2, 3])
type(a[0])
numpy.int32
a = np.array(range(10),dtype=np.int8)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int8)
a = np.array(range(10),dtype='b')
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int8)
a = np.array(range(10),dtype='f')
a
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
np.sctypeDict
是一个字典,它映射了NumPy中每个数据类型到其对应的字符代码。
它允许在类型代码和NumPy数据类型之间进行转换和查找。
对应数据类型 | 类型代码 |
---|---|
numpy.bool_ | ‘?’, 0, ‘b1’, ‘bool8’, ‘bool_’ |
numpy.int8 | ‘byte’, ‘b’, 1, ‘int8’, ‘i1’ |
numpy.uint8 | ‘ubyte’, ‘B’, 2, ‘uint8’, ‘u1’ |
numpy.int16 | ‘short’, ‘h’, 3, ‘int16’, ‘i2’ |
numpy.uint16 | ‘ushort’, ‘H’, 4, ‘uint16’, ‘u2’ |
numpy.intc | ‘i’, 5, ‘intc’ |
numpy.uint32 | ‘uint’, ‘I’, ‘uint32’, ‘u4’ |
numpy.uintc | 6, ‘uintc’ |
numpy.int64 | ‘intp’, ‘p’, 9, ‘int64’, ‘i8’, ‘longlong’, ‘q’ |
numpy.uint64 | ‘uintp’, ‘P’, 10, ‘uint64’, ‘u8’, ‘ulonglong’, ‘Q’ |
numpy.int32 | ‘long’, ‘l’, 7, ‘int32’, ‘i4’ |
numpy.uint32 | ‘ulong’, ‘L’, 8, ‘uint32’, ‘u4’ |
numpy.float16 | ‘half’, ‘e’, 23, ‘f2’, ‘float16’ |
numpy.float32 | ‘f’, 11, ‘single’, ‘f4’, ‘float32’ |
numpy.float64 | ‘double’, ‘d’, 12, ‘float_’, ‘f8’, ‘float64’ |
numpy.longdouble | ‘longdouble’, ‘g’, 13, ‘longfloat’ |
numpy.complex128 | ‘cfloat’, ‘cdouble’, ‘D’, 15, ‘complex_’, ‘complex’ |
numpy.complex64 | ‘F’, 14, ‘csingle’, ‘singlecomplex’, ‘c8’, ‘complex64’ |
numpy.clongdouble | ‘clongfloat’, ‘G’, 16, ‘longcomplex’ |
numpy.object_ | ‘O’, 17, ‘object0’, ‘object_’, ‘object’ |
numpy.bytes_ | ‘S’, 18, ‘bytes0’, ‘bytes_’, ‘string_’, ‘a’ |
numpy.str_ | ‘unicode’, ‘U’, 19, ‘str0’, ‘str_’, ‘unicode_’, ‘str’ |
numpy.void | ‘void’, ‘V’, 20, ‘void0’ |
numpy.datetime64 | ‘M’, 21, ‘M8’, ‘datetime64’ |
numpy.timedelta64 | ‘m’, 22, ‘m8’, ‘timedelta64’ |
# a.astype('U')用于将数组a的数据类型转换为Unicode字符串类型
a.astype('U')
array(['0.0', '1.0', '2.0', '3.0', '4.0', '5.0', '6.0', '7.0', '8.0',
'9.0'], dtype='
numpy访问与列表类似,支取切片操作
import numpy as np
a = np.arange(25)
#索引0对应值:
v = a[0]
print(v)
#索引为10值:
v = a[10]
print(v)
#切片操作:
v = a[10:20]
print(v)
v = a[20:]
print(v)
v = a[10:20:2]
print(v)
v = a[20:10:-2]
print(v)
0
10
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24]
[10 12 14 16 18]
[20 18 16 14 12]
轴是指数组沿着某个方向的线性序列,也就是数组的维度。
一维数组有一个轴,二维数组有两个轴,以此类推。
轴的数量也称为秩,它表示数组的维度数量。例如,一个二维数组的秩为2,一个三维数组的秩为3。
#二维array
import numpy as np
a = np.arange(25)
#2x2矩阵
a = a.reshape(5,5)
print(a)
#取a[0]
print('->a[0]:\t\t',a[0])
#取a[0][0]
print('->a[0][0]:\t',a[0][0])
[[ 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]]
->a[0]: [0 1 2 3 4]
->a[0][0]: 0
array取值:
#取前三行
a[0:3]
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
#取指定行
a[[1,2,4]]
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[20, 21, 22, 23, 24]])
#取第二列
a[:,1]
array([ 1, 6, 11, 16, 21])
#取1,3两列
a[:,[1,3]]
array([[ 1, 3],
[ 6, 8],
[11, 13],
[16, 18],
[21, 23]])
#三维array
import numpy as np
a = np.arange(27)
#2x2矩阵
a = a.reshape(3,3,3)
print(a)
#取a[0]
print(a[0])
#取a[0][0]
print('->a[0][0]:\t',a[0][0])
print('->a[0][0][0]:\t',a[0][0][0])
[[[ 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]]]
[[0 1 2]
[3 4 5]
[6 7 8]]
->a[0][0]: [0 1 2]
->a[0][0][0]: 0
#array修改
a = np.arange(10)
print(a)
#修改一个元素
a[0] = 10
print(a)
#修改多个元素
a[:5] = 10
print(a)
[0 1 2 3 4 5 6 7 8 9]
[10 1 2 3 4 5 6 7 8 9]
[10 10 10 10 10 5 6 7 8 9]
基本运算被应用到array所有的元素中
# numpy广播: boardcasting
a = np.arange(10)
print(a)
print(a*10)
print(a+1)
print(a/2)
[0 1 2 3 4 5 6 7 8 9]
[ 0 10 20 30 40 50 60 70 80 90]
[ 1 2 3 4 5 6 7 8 9 10]
[0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5]
# array之间计算
a = np.arange(5)
b = np.array([1,2,3,4,5])
print(a)
print(b)
print(a+b)
print(a*b)
[0 1 2 3 4]
[1 2 3 4 5]
[1 3 5 7 9]
[ 0 2 6 12 20]
# 多维array之间计算
t = np.arange(10).reshape(2,5)
a = np.ones_like(t)
b = np.full_like(t, 10)
print(a)
print(b)
print(a+b)
[[1 1 1 1 1]
[1 1 1 1 1]]
[[10 10 10 10 10]
[10 10 10 10 10]]
[[11 11 11 11 11]
[11 11 11 11 11]]
主要包括:求和,均值,方差,累积和等;
numpy模块与array对象都支持这些方法,使用方式也类似;
这些方法参数类似,我们以sum为例:
np.sum(a,axis=None,dtype=None,out=None,keepdims=,initial=)
a.sum(axis=None, dtype=None, out=None, keepdims=False)
numpy中常用计算相关方法:
方法 | 说明 |
---|---|
np.mean() | 计算均值 |
np.max() | 最大值 |
np.min() | 最小值 |
np.cumsum() | 计算累加和 |
np.std() | 计算标准差 |
np.var() | 计算方差 |
np.cov() | 计算协方差 |
np.average() | 计算平均值 |
np.media() | 计算中位数 |
np.ptp() | 计算极值(最大值与最小值差) |
import numpy as np
a = np.arange(10)
print(a)
#求和,最大,最小,极差
print(np.sum(a), np.max(a), np.min(a), np.ptp(a))
#方差,中位数,
print(np.var(a), np.median(a))
#累加和:[a[0], a[0]+a[1], a[0]+a[1]+a[2], ...]
print(np.cumsum(a))
[0 1 2 3 4 5 6 7 8 9]
45 9 0 9
8.25 4.5
[ 0 1 3 6 10 15 21 28 36 45]
方法 | 说明 |
---|---|
np.sqrt() | 计算平方根 |
np.log() | 计算对数 |
np.min() | 最小值 |
np.cos/sin/tan | 三角函数 |
np.std() | 计算标准差 |
多维array指定axis,可以得到不同效果,在计算常用指标,发挥奇效。
import numpy as np
a = np.arange(10)
a = a.reshape(2,5)
a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#指定axis为1,按行进行计算
print(np.sum(a, axis=1))
#指定axis为0:按列进行计算
print(np.sum(a, axis=0))
[10 35]
[ 5 7 9 11 13]
b = np.array(range(1,3)).reshape(2,1)
print(b)
c = np.array(range(0,5))
print(c)
[[1]
[2]]
[0 1 2 3 4]
# 不同长度相加
print(a+b)
print(a+c)
[[ 1 2 3 4 5]
[ 7 8 9 10 11]]
[[ 0 2 4 6 8]
[ 5 7 9 11 13]]
t = np.arange(8).reshape(2,2,2)
print(t)
for i in range(0,3):
print()
print("axis=%d:\n"%i,t.sum(axis=i))
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
axis=0:
[[ 4 6]
[ 8 10]]
axis=1:
[[ 2 4]
[10 12]]
axis=2:
[[ 1 5]
[ 9 13]]
b = np.array([[[1,2,3,4],[1,3,4,5]],[[2,4,7,5],[8,4,3,5]],[[2,5,7,3],[1,5,3,7]]])
print(b)
print("shape =",b.shape)
for i in range(0,3):
print()
print("axis=%d:\n"%i,b.sum(axis=i))
[[[1 2 3 4]
[1 3 4 5]]
[[2 4 7 5]
[8 4 3 5]]
[[2 5 7 3]
[1 5 3 7]]]
shape = (3, 2, 4)
axis=0:
[[ 5 11 17 12]
[10 12 10 17]]
axis=1:
[[ 2 5 7 9]
[10 8 10 10]
[ 3 10 10 10]]
axis=2:
[[10 13]
[18 20]
[17 16]]
多个数组拼接:concatenate((a1, a2, ...), axis=0, out=None)
a = np.arange(1,5).reshape(2,2)
b = np.arange(5,9).reshape(2,2)
print(f'{a}\n---\n{b}')
[[1 2]
[3 4]]
---
[[5 6]
[7 8]]
#轴为1进行拼接
'''
[[1,2],[3,4]]
[[5,6],[7,8]]
结果
[1,2,]+[5,6]
[3,4]+[7,8]
'''
np.concatenate((a,b), axis=1)
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
#轴为0进行拼接
np.concatenate((a,b), axis=0)
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
np.stack(arrays, axis=0, out=None)
基本理解:arrays,沿着axis进行堆叠,类似穿起来,而不是拼接 例如:
a = np.arange(0,2)
b = np.arange(2,4)
c = np.arange(4,6)
'''
[0, 1]
[2, 3]
[4, 5] ->
沿着axis=0拼接:
[[0, 1],
[2, 3],
[4, 5],]
'''
np.stack((a,b,c), axis=0)
array([[0, 1],
[2, 3],
[4, 5]])
a = np.arange(0,2)
b = np.arange(2,4)
c = np.arange(4,6)
'''
[0, 1]
[2, 3]
[4, 5] ->
沿着axis=1拼接:
[[0,2,4],
[1,3,5]]
'''
np.stack((a,b,c), axis=1)
array([[0, 2, 4],
[1, 3, 5]])
分别为水平拼接与垂直拼接
a = np.arange(0,2)
b = np.arange(2,4)
c = np.arange(4,6)
print(np.hstack((a,b,c)))
print(np.vstack((a,b,c)))
[0 1 2 3 4 5]
[[0 1]
[2 3]
[4 5]]
split方法:将制定的array按照aixs分割成制定值
np.split(ary, indices_or_sections, axis=0)
np.split(np.arange(4),2, axis=0)
[array([0, 1]), array([2, 3])]
a = np.arange(8).reshape(2,4)
print(a)
[[0 1 2 3]
[4 5 6 7]]
#按照axis=0进行切分,分成2份
np.split(a, 2, axis=0)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]])]
#按照axis=1进行切分,分成2份
np.split(a, 2, axis=1)
[array([[0, 1],
[4, 5]]),
array([[2, 3],
[6, 7]])]
vsplit沿着垂直轴切分
hsplit沿着水平轴切分
a = np.arange(10)
np.hsplit(a, 5)
[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
a = np.arange(10).reshape(2,5)
np.vsplit(a, 2)
[array([[0, 1, 2, 3, 4]]), array([[5, 6, 7, 8, 9]])]
一个例子:某同学两次考试,有一次因为某些情况没有参加,数据格式如下:
v1 = np.array([[90, 100],[np.nan, 100]])
v1
array([[ 90., 100.],
[ nan, 100.]])
np.isnan(v1)
array([[False, False],
[ True, False]])
array的值都为True或者False;
例如:array([[False, False],[ True, False]])
获取所有nan值:
np.isnan(v1)
array([[False, False],
[ True, False]])
v1[np.isnan(v1)]
array([nan])
#获取非nan值
v1[np.isnan(v1) == False]
array([ 90., 100., 100.])
np.all(a, axis=None, out=None, )
:沿着给定的axis判断是否有元素为0,为0返回False,不设置axis,判断所有元素
np.any(a, axis=None, out=None, )
:沿着给定的axis判断是否有元素不为0,为0返回False,不设置axis,判断所有元
a = np.arange(10)
print(a)
print(np.all(a))
[0 1 2 3 4 5 6 7 8 9]
False
a = np.arange(10).reshape(2,5)
print(a)
#沿着axis=0,简单理解垂直轴
print(np.all(a, axis=0))
#沿着axis=1,简单理解水平轴
print(np.all(a, axis=1))
[[0 1 2 3 4]
[5 6 7 8 9]]
[False True True True True]
[False True]
b = np.zeros_like(a)
print(b)
print(f'a:{np.all(a)},b:{np.all(b)}')
print(f'a:{np.any(a)},b:{np.any(b)}')
[[0 0 0 0 0]
[0 0 0 0 0]]
a:False,b:False
a:True,b:False
a = np.array([1, None])
print(a)
print(np.any(a))
print(np.all(a))
[1 None]
1
None
a = np.random.randint(10,100,size=10)
print(a)
print(a[a>59])
[63 53 11 20 12 50 28 35 76 90]
[63 76 90]
where(condition, [x, y])
:
示例:随机生成成绩单,判断是否及格
a = np.random.randint(30,100, 10)
print(a)
np.where(a>=60, 'pass', 'failed')
[88 52 88 59 46 85 51 89 98 64]
array(['pass', 'failed', 'pass', 'failed', 'failed', 'pass', 'failed',
'pass', 'pass', 'pass'], dtype='
np.where(a>=60)
(array([0, 2, 5, 7, 8, 9], dtype=int64),)
a[np.where(a>=60)]
array([88, 88, 85, 89, 98, 64])
'''
在Python请独立编写查找函数:def binary_search (nums, target)
要求:
1:使用二分查找实现
2:如果在text中找到value,返回对应的索引,否则返回-1
'''
def binary_search(nums, target):
left, right = 0, len(nums) - 1 # 初始化左右指针
while left <= right:
mid = left + (right - left) // 2 # 计算中间索引,防止溢出
if nums[mid] == target: # 如果中间值等于目标值
return mid # 返回中间索引
elif nums[mid] < target: # 如果中间值小于目标值
left = mid + 1 # 更新左指针为中间索引加1
else:
right = mid - 1 # 如果中间值大于目标值,更新右指针为中间索引减1
return -1 # 目标值不在数组中,返回-1
# 示例用法:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
target = 7
result = binary_search(nums, target)
if result != -1:
print(f"目标值 {target} 在数组中的索引是 {result}")
else:
print(f"目标值 {target} 不在数组中")
目标值 7 在数组中的索引是 6