【Python基础】Numpy使用指南

文章目录

  • Numpy使用指南
    • 1 numpy简介
    • 2 numpy安装
    • 3 ndarray
      • 3.1 ndarry轴与秩
      • 3.2 ndarray 相关属性
      • 3.3 创建 ndarray 对象
      • 3.4 np.radom相关方法
      • 3.5 reshape方法
      • 3.6 ndarray对象转其他数据结构
    • 4 numpy的数据类型
    • 5 numpy访问与修改
      • 5.1 一维array
      • 5.2 numpy中的轴
    • 6 numpy计算
      • 6.1 基本计算
      • 6.2 多维array计算
    • 7 numpy数据拼接分割
      • 7.1 多个array拼接
      • 7.2 多个数组的堆叠
      • 7.3 np.hstack与np.vstack
      • 7.4 numpy分割
      • 7.5 vsplit与hsplit
    • 8 numpy其他操作
      • 8.1 nan与缺省值处理
      • 8.2 nan判断
      • 8.3 boolean索引
      • 8.4 np.all与any
      • 8.5 np.where

Numpy使用指南

1 numpy简介

numpy:开源的python科学计算模块,用于数据快速处理;

numpy支持矩阵与数组操作,计算速度快,是Python中科学计算的基础库;

numpy优点:

  1. 底层使用C语言实现,计算速度快
  2. numpy支持均值,累积和,方差等运算,可以直接使用;
  3. numpy处理数据方式灵活,支持excel, csv等多种方式数据导入;
import numpy as np
values = np.array([1,2,3,4,5])
print(values)
print(type(values))

[1 2 3 4 5]

2 numpy安装

numpy安装:

  • 方式1:pip install numpy
  • 方式2:anaconda环境:自带numpy,不用安装
  • numpy官方文档:https://numpy.org/doc/ (https://numpy.org/doc/)
  • numpy源码:https://github.com/numpy/numpy (https://github.com/numpy/numpy)

3 ndarray

array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

参数 说明
objec 类似数组对象,例如:序列,range对象等
dtype 元素类型
order 数据内存排列形式
ndmin 指定维度
  1. numpy中基本数据结构;
  2. ndarray对象索引从0开始
  3. 所有元素是同一种类型;
  4. 与列表类似,支持切片等操作;
#一维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.]]

3.1 ndarry轴与秩

  • 轴(axis):每一个线性的数组称为是一个轴;
    • 第一个轴(axis=0):第一层数组,
    • 第二个轴(axis=1):数组里的数组
  • 秩(rank):维度

示意图:
【Python基础】Numpy使用指南_第1张图片

3.2 ndarray 相关属性

属性 说明
.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

3.3 创建 ndarray 对象

方法 说明
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]

3.4 np.radom相关方法

方法 说明
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]]

3.5 reshape方法

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:

  • 二维array对象:
    a = [[1,2],[3,4]]
  • C代表在C语言中数据在内存存储方式:
    a[0][0],a[0][1],a[1][0],a[1][1]
  • F代表在Fortran语言中数据在内存存储方式:
    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]

3.6 ndarray对象转其他数据结构

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'

4 numpy的数据类型

常用数据类型:

类型 类型代码 说明
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='

5 numpy访问与修改

numpy访问与列表类似,支取切片操作

5.1 一维array

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]

5.2 numpy中的轴

轴是指数组沿着某个方向的线性序列,也就是数组的维度。

一维数组有一个轴,二维数组有两个轴,以此类推。

轴的数量也称为秩,它表示数组的维度数量。例如,一个二维数组的秩为2,一个三维数组的秩为3。

  1. 二维array
#二维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]])
  1. 三维array
#三维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
  1. array修改
#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]

6 numpy计算

6.1 基本计算

  1. 广播计算

基本运算被应用到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]
  1. array之间计算
# 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]
  1. 多维array之间计算
# 多维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]]
  1. 基本计算

主要包括:求和,均值,方差,累积和等;

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]
  1. numpy其他计算相关方法
方法 说明
np.sqrt() 计算平方根
np.log() 计算对数
np.min() 最小值
np.cos/sin/tan 三角函数
np.std() 计算标准差

6.2 多维array计算

多维array指定axis,可以得到不同效果,在计算常用指标,发挥奇效。

  • shape不同不能计算
  • 一维array与多维array的行相同,可以计算
  • 一维array与多维array的列相同,可以计算
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]])
  1. 二维基于 axis 的基本运算
#指定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]
  1. 不同长度相加
# 不同长度相加
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]]
  1. 三维基于 axis 的基本运算
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]]
  1. 四维基于 axis 的基本运算
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]]

7 numpy数据拼接分割

7.1 多个array拼接

多个数组拼接: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]])

7.2 多个数组的堆叠

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]])

7.3 np.hstack与np.vstack

分别为水平拼接与垂直拼接

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]]

7.4 numpy分割

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]])]

7.5 vsplit与hsplit

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]])]

8 numpy其他操作

8.1 nan与缺省值处理

  • Nan是nunpy和pandas中用于标识缺失数据
  • None:Python 中对象,不能与Nan混淆一起

一个例子:某同学两次考试,有一次因为某些情况没有参加,数据格式如下:

v1 = np.array([[90, 100],[np.nan, 100]])
v1
array([[ 90., 100.],
       [ nan, 100.]])

8.2 nan判断

np.isnan(v1)
array([[False, False],
       [ True, False]])

8.3 boolean索引

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.])

8.4 np.all与any

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]

8.5 np.where

where(condition, [x, y]):

  • 如果给定x,y,满足条件condition,输出x,不满足输出y;
  • 如果没有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

你可能感兴趣的:(Python基础,python,numpy,开发语言)