【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]
<class 'numpy.ndarray'>

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):维度

示意图:
image-20240202090913695

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/64i1/i2/i4/i8有符号8/16/32/64位整数
uint8/16/32/64u1/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.uintc6, ‘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='<U32')

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='<U6')
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Methodot低代码实战教程(一)——熟悉可视化Echart组件

一、产品介绍&#xff1a; Methodot是行云创新旗下一款面向研发使用的一站式云原生开发及应用托管平台&#xff0c;产品内有大量开箱即用的服务和开发工具&#xff0c;例如&#xff1a; 支持开发团队进行微服务架构设计&#xff08;例如一个袜子商店管理系统&#xff09;&…

病原菌共感染研究思路

近年来,多微生物共感染在临床上的报道日益增多。其中,多细菌共感染占据了细菌感染的25% ,其发病率和严重性也相应增加。尤其在形成生物膜后,这种共感染对疾病的发生、发展和临床治疗生重要影响,同时也给临床治疗带来了更大的挑战。 随着测序的发展&#xff0c;应用高通量转录组…

Java黑马——拼图小游戏

拼图小游戏&#xff08;GUI&#xff09; AWT包会有些兼容问题&#xff0c;不支持某些中文 在本次游戏的GUI开发中&#xff0c;我们将使用Swing包 一、主界面分析 这些东西统一称为组件&#xff0c;JFrame是一个组件、JMenuBar也是一个组件、等等 1、练习一&#xff1a;创建主…

离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型 制作双语字幕的方案网上有很多&#xff0c;林林总总&#xff0c;不一而足。制作双语字幕的原理也极其简单&#xff0c;无非就是人声背景音分离、语音转文字、文字翻译&#xff0c;最后就是字幕文件的合并&#xff0c…

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

消息中间件特性

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

Base64编码原理

Base64编码原理非常简单&#xff0c;首先确定好要编码的字符串&#xff0c;并查找其对应的 ASCII码将其转换为二进制表示&#xff0c;每三个8位的字节转换为四个6位的字节 &#xff08;384 624&#xff09;&#xff0c;把6位的最高位添两位数字0 &#xff0c;组成四个8位的字节…

内裤洗衣机有用吗?口碑好的小型洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

前端JavaScript篇之let、const、var的区别

目录 let、const、var的区别 let、const、var的区别 let、const和var是JavaScript中用于声明变量的关键字&#xff0c;它们之间有一些区别。 首先&#xff0c;var是在ES5中引入的关键字&#xff0c;而let和const是在ES6中引入的。在ES6之前&#xff0c;我们只能使用var来声明…

基于STM32F103C8T6最小系统板(对标某淘)

原理图和PCB都和某淘购买一样&#xff01;&#xff01;&#xff01; 原理图 PCB 3D图

炒股操作方法!南通怎么开股票账户佣金最低?炒股交易手续费最低?

炒股操作方法可以有很多种&#xff0c;以下是一些建议&#xff1a;这些是一些股票交易技巧&#xff0c;希望对你有帮助。请记住&#xff0c;投资有风险&#xff0c;决策请谨慎。 设定明确的投资目标&#xff1a;确定你的投资目标&#xff0c;是为了长期投资还是短期交易&#x…

BGP按组打包

按组打包技术将所有拥有共同出口策略的BGP邻居当作是一个打包组 每条待发送路由只被打包一次然后发给组内的所有邻居 RR1发给三个Client&#xff0c;需要发三份路由。 通过按组打包&#xff0c;可以将路由打包&#xff0c;一次发给所有组内的邻居&#xff08;前提是出口策略相…

【数据分享】1929-2023年全球站点的逐年最高气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)

客户端流程 客户端心跳与实例往服务端注册

fastadmin导入excel并对导入数据处理

情景描述 fastadmin有自带的导入功能&#xff0c;但是不好用&#xff0c;它要求你的表格标题必须跟数据表的备注一致&#xff0c;而且拿到的数据是直接插入数据表&#xff0c;我们无法获取想要的数据并对数据进行处理&#xff1b;而且有时候我们只是想要单纯的读取文件功能&…

k8s之安装部署及kuboard发布应用

目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm&#xff0c;kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水 下一个更大元素II 503.下一个更大元素II 文章讲解&#xff1a;https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II.html 题目链接&#xff1a;https://…

守好“安全关” 筑牢“安全线”—济南中医风湿病医院6S管理小组开展安全生产大检查活动

春节将至&#xff0c;许多患者希望在春节前获得康复&#xff0c;因此预约到院参与会诊的患者数量较多。为营造干净整洁迎佳节的浓厚氛围&#xff0c;提升群众就医满意度&#xff0c;优化就医服务&#xff0c;改善医院医疗环境&#xff0c;结合6S精益管理&#xff0c;做到整理、…

深度学习的新前沿:突破、应用与挑战

引言 深度学习的快速发展已经在人工智能领域引起了革命性的变化。作为模仿人脑结构和功能的强大工具&#xff0c;深度神经网络在图像识别、自然语言处理、医学诊断等多个领域取得了显著成就。但是&#xff0c;随着技术的不断推进&#xff0c;深度学习也在不断地进化和扩展其能…

【QT】贪吃蛇小游戏 -- 童年回忆

成品展示 项目分析&#xff1a; &#x1f40d;基本元素如下 &#x1f40d;小蛇的设计&#xff0c;初始大小蛇头占一个方块&#xff0c;蛇身占两个方块。 &#x1f40d;关于小蛇的移动&#xff0c;采用蛇头前进方向增加一个方块&#xff0c;蛇尾减掉一个方块的实现方法。 &#…