当前位置: 首页 > news >正文

Python 之 Pandas DataFrame 数据类型的行操作和常用属性和方法汇总

文章目录

  • 一、DataFrame 行操作
    • 1. 标签选取
    • 2. 数值型索引和切片
    • 3. 切片操作多行选取
    • 4. 添加数据行
      • 4.1 追加字典
      • 4.2 追加列表
    • 5. 删除数据行
  • 二、常用属性和方法汇总
    • 1. 转置
    • 2. axes
    • 3. dtypes
    • 4. empty
    • 5. columns
    • 6. shape
    • 7. values
    • 8. head() & tail()
    • 9. 修改列名 rename()
    • 10. info() 函数
    • 11. df. sort_index() 函数
    • 12. df.sort_values() 函数

  • DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一,可以这么说,掌握了 DataFrame 的用法,你就拥有了学习数据分析的基本能力。
  • 在开始之前,我们需要先引入 numpy 和 pandas 库。
import numpy as np​
import pandas as pd

一、DataFrame 行操作

  • 在我们理解了前文的列索引操作后,行索引操作就变的简单。
  • 具体列索引操作详见 Python 之 Pandas DataFrame 数据类型的简介、创建的列操作。

1. 标签选取

  • 行操作需要借助 loc 属性来完成:按标签或布尔数组访问一组行和列。
  • 首先,我们定义一个字典,作为初始数据,创建 DataFrame 数据结构。
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print("===========df原始数据========")
print(df)
#===========df原始数据========
#    one  two
# a  1.0    1 
# b  2.0    2 
# c  3.0    3 
# d  NaN    4
  • 然后,我们确定标签为 b 的数据。
print("===========标签为b的数据========")
print(df.loc['b'])
#===========标签为b的数据========
#one    2.0
#two    2.0
#Name: b, dtype: float64
  • 这里需要注意的是,loc 允许接受两个参数分别是行和列。
  • 例如,我们选取 b 行 one 列交叉的数据。
df.loc['b',"one"]
#2.0
  • 除此之外,行和列还可以使用切片。
  • 例如,标签为 b 的行到标签为 d 的行, 对应标签为 one 的列。
  • 这里需要注意的是,使用行标签切片,是包含结束的行。
df.loc['b':'d',"one"]   # 注意
#b    2.0
#c    3.0
#d    NaN
#Name: one, dtype: float64
  • 用过 loc 索引的行和列与 numpy 整数数组索引的区别如下,loc 是通过标签进行取值,他有两个参数,第一个代表行,第二个代表列。
df.loc[['a','b'],["one","two"]]
#   one	 two
#a	1.0	   1
#b	2.0	   2
  • 我们可以通过 np.arange( ).reshape( ) 生成一个从 0 到 1 的三行四列的指定元素数组,然后调用其中第一行和第一列,第三行和第四列分别相交的数据。
s = np.arange(12).reshape((3,4))
s
#array([[ 0,  1,  2,  3],
#          [ 4,  5,  6,  7], 
#          [ 8,  9, 10, 11]])
s[[0,2],[0,3]]
#array([ 0, 11])

2. 数值型索引和切片

  • 使用数据型索引,需要使用 iloc 属性。
  • 直接使用索引,会优先查找的是列标签,如果找不到会报错,列没有位置索引。
  • 可以使用 iloc,行基于整数位置的按位置选择索引。
  • 例如,我们指定 data 数据,然后定义行标签,通过字典创建 DataFrame。
data = {'Name':['关羽', '刘备', '张飞', '曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2", "rank3", "rank4"]
df = pd.DataFrame(data, index=index)
df
#       Name   Age
#rank1	关羽	28
#rank2	刘备	34
#rank3	张飞	29
#rank4	曹操	42
  • 然后,我们取得位置索引为 2 的数据。
df.iloc[2]
#Name    张飞
#Age     29
#Name: rank3, dtype: object
  • 我们也可以同时取得位置索引分别为 0 和 2 的数据。
df.iloc[[0,2]]
Name	Age
rank1	关羽	28
rank3	张飞	29
  • 我们也可以选择行索引为 0,列索引为 1 的数据。
df.iloc[0,1]
#28
  • 这里需要注意的是,loc 使用的是标签索引,iloc 使用的是位置索引,两者不能混用,比如在 loc 中使用位置索引,或者在 iloc 中使用标签索引。
  • 常见有如下的错误写法:loc 当中使用了 1 这个位置索引,iloc 当中使用了 Name 这个标签索引。
#df.loc[1,"Name"]
#df.iloc[1,"Name"]

3. 切片操作多行选取

  • 可以直接使用数值型切片操作行,和使用 iloc 同样的结果。
  • 例如,我们指定 data 数据,然后定义行标签,通过字典创建 DataFrame。
data = {'Name':['关羽', '刘备', '张飞', '曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2", "rank3", "rank4"]
df = pd.DataFrame(data, index=index)
df
#       Name    Age
#rank1	关羽	28
#rank2	刘备	34
#rank3	张飞	29
#rank4	曹操	42
  • 然后,我们取得取得位置索引从 1 到 3 的行,但是不包含第 3 行的数据。
print("=====df.iloc[1:3]:=======")
print(df.iloc[1:3])
#=====df.iloc[1:3]:=======
#      Name  Age
#rank2   刘备   34
#rank3   张飞   29
  • 我们使用切片可以直接提取行。
print("=====df[1:3]:=======")
print(df[1:3])
#=====df[1:3]:=======
#        Name  Age
#rank2   刘备   34
#rank3   张飞   29

4. 添加数据行

  • 使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行.
  • 其语法模板如下:
df.append(other, ignore_index=False, verify_integrity=False, sort=False)
  • 将 other 追加到调用者的末尾,返回一个新对象。other 行中不在调用者中的列将作为新列添加。
  • 其参数含义如下:
  • other 表示 DataFrame 或 Series/dict 类对象,或这些对象的列表。
  • ignore_index 默认为 False,如果为 True 将不适用 index 标签。
  • verify_integrity 默认为 False ,如果为 True,则在创建具有重复项的索引时引发 ValueError。
  • sort 表示排序。
  • 例如,我们可以生成一个指定数据的数组,并于后续的操作观察。
data = {'Name':['关羽', '刘备', '张飞', '曹操'], 'Age':[28, 34, 29, 42],"Salary":[5000, 8000, 4500, 10000]}
df = pd.DataFrame(data)
df
#	Name	Age	 Salary
# 0	关羽	28 	  5000
# 1	刘备	34	  8000 
# 2	张飞	29	  4500
# 3	曹操	42	  10000

4.1 追加字典

  • 我们在行末新加一个数据行,此时,我们需要添加 ignore_index=True,否则会报错。例如下述操作。
d2 = {"Name":"诸葛亮", "Age":30}
df3 = df.append(d2)
print(df3)
  • 错误提示:Can only append a Series if ignore_index=True or if the Series has a name。
  • 这是因为仅当 ignore_index=True 或序列有名称时,才能追加序列。
d2 = {"Name":"诸葛亮", "Age":30}
df3 = df.append(d2, ignore_index=True) # 需要添加 
print(df3)
#    Name    Age   Salary
#0   关羽     28   5000.0
#1   刘备     34   8000.0
#2   张飞     29   4500.0
#3   曹操     42   10000.0
#4   诸葛亮   30   NaN
  • 或者 Series 数据当中有 name。
d2 = {"Name":"诸葛亮", "Age":30}​
s = pd.Series(d2, name="a")
print(s)
df3 = df.append(s)
print(df3)
#Name    诸葛亮 
#Age      30 
#Name: a, dtype: object
#    Name    Age   Salary 
#0   关羽     28   5000.0 
#1   刘备     34   8000.0 
#2   张飞     29   4500.0 
#3   曹操     42   10000.0 
#a  诸葛亮   30   NaN

4.2 追加列表

  • 如果 list 是一维的,则以列的形式追加。
  • 如果 list 是二维的,则以行的形式追加。
  • 如果 list 是三维的,只添加一个值。
  • 这里需要注意的是,使用 append 可能会出现相同的 index,想避免的话,可以使用 ignore_index=True。
  • 首先,我们生成输出数据数组,便于后续的观察操作。
data = [[1, 2, 3, 4],[5, 6, 7, 8]]              
df = pd.DataFrame(data)
print(df)
#   0  1  2  3
#0  1  2  3  4
#1  5  6  7  8
  • (1) 当 list 是一维的,则以列的形式追加。
a_l = [10,20]​
df3 = df.append(a_l)
print(df3)
#    0    1    2    3
#0   1  2.0  3.0  4.0 
#1   5  6.0  7.0  8.0 
#0  10  NaN  NaN  NaN 
#1  20  NaN  NaN  NaN
  • (2) 当 list 是二维的,则以行的形式追加。
a_l = [[10,"20",30],[2,5,6]]
df4 = df.append(a_l) 
print(df4)
#    0   1   2    3
#0   1   2   3  4.0 
#1   5   6   7  8.0 
#0  10  20  30  NaN 
#1   2   5   6  NaN
  • 此时,我们会发现行标签有点不太对,因此我们使用 ignore_index=True。
print("=========使用:ignore_index=True===========")
df5 = df.append(a_l,ignore_index=True) # 需要添加 
print(df5)
#=========使用:ignore_index=True===========
#     0   1   2    3 
#0   1   2   3  4.0 
#1   5   6   7  8.0 
#2  10  20  30  NaN 
#3   2   5   6  NaN
  • 在这里需要注意的是,append 不改变原数据,是生成一个新数据。

5. 删除数据行

​- 可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。示例如下:

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])​
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])​
df = df.append(df2)
print("=======源数据df=======")
print(df)
#=======源数据df=======
#   a  b 
#0  1  2 
#1  3  4 
#0  5  6 
#1  7  8
  • 注意此处调用了 drop() 方法,drop 默认不会更改源数据,而是返回另一个dataframe来存放删除后的数据。
  • (1) drop 函数默认删除行,列需要加 axis = 1。
  • (2) 当 inplace 为 False 时不会修改源数据,为 True 时会修改源数据。
df1 = df.drop(0)
print("=======修改后数据df1=======")
print(df1)
=======修改后数据df1=======
#    a  b 
#1  3  4 
#1  7  8

二、常用属性和方法汇总

名称属性&方法描述
T行和列转置。
axes返回一个仅以行轴标签和列轴标签为成员的列表。
dtypes返回每列数据的数据类型。
emptyDataFrame中没有数据或者任意坐标轴的长度为0,则返回True
columns返回DataFrame所有列标签
shape返回一个元组,获取行数和列数,表示了 DataFrame 维度。
sizeDataFrame中的元素数量。
values使用 numpy 数组表示 DataFrame 中的元素值。
head()返回前 n 行数据。
tail()返回后 n 行数据。
rename()rename(columns=字典) ,修改列名
info()可以显示信息,例如行数/列数,总内存使用量,每列的数据类型以及不缺少值的元素数
sort_index()默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
sort_values()既可以根据列数据,也可根据行数据排序
  • 我们先生成一个初始数据数组,用以后续的观察操作。
data = {'Name':['关羽', '刘备', '张飞', '曹操'], 'Age':[28, 34, 29, 42],"Salary":[5000, 8000, 4500, 10000]}
df = pd.DataFrame(data)
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000

1. 转置

  • 返回 DataFrame 的转置,也就是把行和列进行交换,但是源数据是不会发生任何变化的。
df.T0	   1	   2	   3
Name	关羽	刘备	张飞	曹操 
Age	      28	  34	  29	  42 
Salary	5000	8000	4500   10000	

2. axes

  • 返回一个行标签、列标签组成的列表。
print(df.axes)
[df.index,df.columns]
#[RangeIndex(start=0, stop=4, step=1), Index(['Name', 'Age', 'Salary'], dtype='object')]

3. dtypes

  • 返回 Series 每一列的数据类型。示例如下:
df.dtypes
Name      object
Age           int64
Salary       int64
dtype: object

4. empty

  • 返回一个布尔值,判断输出的数据对象是否为空,若为 True 表示对象为空。
df.empty
#False
  • 我们创建一个空的 DataFrame。
empty_df = pd.DataFrame()
empty_df.empty 
#True
  • 如果给 DataFrame 数据类型直接判断真假,则会报错: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

5. columns

  • 返回 DataFrame 所有列标签。
df.columns
#Index(['Name', 'Age', 'Salary'], dtype='object')
  • 我们也可以通过 df.columns 的个数获取 DataFrame 当中列的个数。
len(df.columns)
#3
df.columns.size
#3

6. shape

  • 返回一个元组,获取行数和列数,表示了 DataFrame 维度。
df.shape
#(4,3)
row_num,column_num = df.shape
print(row_num,column_num )
#4 3

7. values

  • 以 ndarray 数组的形式返回 DataFrame 中的数据。
df.values
#array([['关羽', 28, 5000], 
#          ['刘备', 34, 8000],        
#          ['张飞', 29, 4500],        
#          ['曹操', 42, 10000]], dtype=object)

8. head() & tail()

  • 我们可以使用 head() 获取前几行数据。
df.head(3)
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500
  • 我们也可以使用 tail() 获取后几行数据。
df.tail(3)
#	Name	Age	Salary 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000

9. 修改列名 rename()

  • 其语法模板如下:
DataFrame.rename(index=None, columns=None, inplace=False)
  • 其参数含义如下:
  • index 表示修改后的行标签。
  • columns 表示修改后的列标签。
  • inplace 表示默认为 False,不改变源数据,返回修改后的数据,True 更改源数据。
  • 先输出原始数据,便于操作和观察。
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000
  • 我们可以修改变量 df 的行标签。
df.rename(index={1:"row2", 2:"row3"})
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#row2	刘备	34	8000 
#row3	张飞	29	4500 
#3	曹操	42	10000
  • 我们可以修改变量 df 的列标签。
df.rename(columns = {"Name":"name", "Age":"age"})
df
#	name	age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000
  • 如果我需要修改源数据的话,添加 inplace 参数。
df.rename(index={1:"row2", 2:"row3"}, columns = {"Name":"name", "Age":"age"}, inplace=True)
df
#	name	age	Salary 
#0	关羽	28	5000 
#row2	刘备	34	8000 
#row3	张飞	29	4500 
#3	曹操	42	10000

10. info() 函数

  • 用于打印 DataFrame 的简要摘要,显示有关 DataFrame 的信息,包括索引的数据类型 dtype 和列的数据类型 dtype,非空值的数量和内存使用情况。
  • 首先,我们创建一组数据,将数据追加到 df 数据中。
data = {"name":"诸葛亮","age":30}
df = df.append(data, ignore_index =True)
df
#	name	age	Salary 
#0	关羽	28	5000.0 
#1	刘备	34	8000.0 
#2	张飞	29	4500.0 
#3	曹操	42	10000.0 
#4	诸葛亮	30	NaN
  • 然后使用 info() 函数。
df.info()
#<class 'pandas.core.frame.DataFrame'> 
#RangeIndex: 5 entries, 0 to 4 
#Data columns (total 3 columns):  
##   Column  Non-Null Count  Dtype   
#---  ------  --------------  -----    
#0   name    5 non-null      object   
#1   age     5 non-null      int64    
#2   Salary  4 non-null      float64 
#dtypes: float64(1), int64(1), object(1) 
#memory usage: 248.0+ bytes
  • 我们来看一看都有些什么信息:
  • (1) <class ‘pandas.core.frame.DataFrame’> 表示数据类型为 DataFrame。
  • (2) RangeIndex: 5 entries, 0 to 4 表示有 5 条数据(也就是 5 行),索引为 0-4。
  • (3) Data columns (total 3 columns) 表示该数据帧有 3 列。
  • (4)# 表示索引号,不用太在意。
  • (5) column 表示每列数据的列名。
  • (6) Non-Null count 表示每列数据的数据个数,缺失值 NaN 不作计算。可以看出上面 Salary 列数据有缺失值。
  • (7) Dtype 表示数据的类型。
  • (8) dtypes 表示float64(1), int64(1), object(1): 数据类型的统计。
  • (9) memory usage 表示 248.0+ bytes: 该数据帧占用的运行内存(RAM)。

11. df. sort_index() 函数

  • 默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
  • 其语法模板如下:
sort_index(axis=0, ascending=True, inplace=False)
  • 其参数含义如下:
  • axis:0 表示按照行名排序;1 表示按照列名排序。
  • ascending:默认 True 升序排列;False 降序排列。
  • inplace:默认 False,否则排序之后的数据直接替换原来的数据。
  • 需要注意的是,df.sort_index() 可以完成和 df.sort_values() 完全相同的功能,但 python 更推荐用只用 df.sort_index() 对根据行标签和根据列标签排序,其他排序方式用 df.sort_values()。
df = pd.DataFrame({'b':[1,2,2,3],'a':[4,3,2,1],'c':[1,3,8,2]},index=[2,0,1,3])  
df 
#    b	a	c 
#2	1	4	1 
#0	2	3	3 
#1	2	2	8 
#3	3	1	2 
  • 我们默认按行标签升序排序,或 df.sort_index(axis=0, ascending=True)。
df.sort_index()
#    b	a	c 
#0	2	3	3 
#1	2	2	8 
#2	1	4	1 
#3	3	1	2 
  • 我们按列标签升序排序
df.sort_index(axis=1)
#   a	b	c 
#2	4	1	1 
#0	3	2	3 
#1	2	2	8 
#3	1	3	2 

12. df.sort_values() 函数

  • 既可以根据列数据,也可根据行数据排序。
  • 其语法模板如下:
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
  • 其参数含义如下:
  • by:str or list of str;如果 axis=0,那么 by=“列名”;如果 axis=1,那么 by=“行名”。
  • axis:{0 or ‘index’, 1 or ‘columns’},default 0,默认按照列排序,即纵向排序;如果为 1,则是横向排序。
  • ascending:布尔型,True 则升序,如果 by=[‘列名1’,‘列名2’],则该参数可以是 [True, False],即第一字段升序,第二个降序。
  • inplace:布尔型,是否用排序后的数据框替换现有的数据框。
  • na_position:{‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面。
  • 需要注意的是,必须指定 by 参数,即必须指定哪几行或哪几列;无法根据 index 名和 columns 名排序(由.sort_index()执行)。
    ​- 我们先生成源数据。
df = pd.DataFrame({'b':[1,2,3,2],'a':[4,3,2,1],'c':[1,3,8,2]},index=[2,0,1,3]) 
df
#	b	a	c 
#2	1	4	1 
#0	2	3	3 
#1	3	2	8 
#3	2	1	2
  • (1) 按 b 列升序排序。
  • 等同于 df.sort_values(by=‘b’,axis=0)。
df.sort_values(by='b') 
print(df)
#	b	a	c 
#2	1	4	1 
#0	2	3	3 
#3	2	1	2 
#1	3	2	8
  • (2) 先按 b 列降序,再按 a 列升序排序。
  • 等同于 df.sort_values(by=[‘b’,‘a’],axis=0,ascending=[False,True])。
df.sort_values(by=['b','a'],ascending=[False,True]) 
print(df)
#   b	a	c 
#1	3	2	8 
#3	2	1	2 
#0	2	3	3 
#2	1	4	1
  • (3) 按行 3 升序排列。
df.sort_values(by=3,axis=1)
print(df)
#	a	b	c 
#2	4	1	1 
#0	3	2	3 
#1	2	3	8 
#3	1	2	2
  • (4) 按行 3 升序,行 0 降排列。
df.sort_values(by=[3,0],axis=1,ascending=[True,False])
print(df)
#	a	b	c 
#2	4	1	1 
#0	3	3	2 
#1	2	8	3 
#3	1	2	2
  • 需要注意的是,指定多列(多行)排序时,先按排在前面的列(行)排序,如果内部有相同数据,再对相同数据内部用下一个列(行)排序,以此类推。
  • 如果内部无重复数据,则后续排列不执行。即首先满足排在前面的参数的排序,再排后面参数。

相关文章:

Python 之 Pandas DataFrame 数据类型的行操作和常用属性和方法汇总

文章目录一、DataFrame 行操作1. 标签选取2. 数值型索引和切片3. 切片操作多行选取4. 添加数据行4.1 追加字典4.2 追加列表5. 删除数据行二、常用属性和方法汇总1. 转置2. axes3. dtypes4. empty5. columns6. shape7. values8. head() & tail()9. 修改列名 rename()10. inf…...

MacOS下载钉钉直播回放视频的Python最新解决方案

tags: Python MacOS Tips 写在前面 之前写过一篇关于用Charles抓包下载钉钉直播回放视频的方法, 那会还是可以直接通过FFmpeg下载m3u8链接并且直接合并的, 但是现在直接上FFmpeg会出现403, 所以还是用别的方法来做吧. 后来发现抓包找到的m3u8不是加密视频流, 那就直接下载ts…...

2023年测试人跳槽新功略,涨薪10K+

软件测试是如何实现涨薪的呢&#xff1f;很多人眼中的软件测试岗位可能是简单的&#xff0c;技术含量不是那么高&#xff0c;就是看看需求、看业务、设计文档、然后点一点功能是否实现&#xff0c;再稍微深入一点就是测试下安装部署时会不会出现兼容性问题&#xff0c;以及易用…...

RabbitMQ之Work Queues

Work Queues 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务…...

CRM哪家好?这5个CRM管理系统很好用!

CRM哪家好&#xff1f;这5个CRM管理系统很好用&#xff01; CRM(Customer Relationship Management)即客户关系管理&#xff0c;能够帮助提高客户的价值、满意度、赢利性和忠实度&#xff0c;缩减销售周期和销售成本、增加收入、寻找扩展业务所需的新的市场和渠道&#xff0c;…...

国内ce认证机构有哪些 国内十大CE认证机构排名 做ce认证的公司推荐

CE认证&#xff0c;是任何企业的任何产品走进欧盟市场的硬性要求。挑选CE认证机构&#xff0c;一定要认准拥有正规资质的机构/企业&#xff0c;例如中国质量认证中心CQC、CVC威凯、CTI华测检测&#xff0c;以及TV南德认证、安博检测、万泰认证等。本文中&#xff0c;MaiGoo小编…...

多If函数封装的策略

在工作中我们经常遇到有多个if的判读函数&#xff0c;这是一件很正常的事情&#xff0c;如下&#xff1a; let order function (orderType, isPay, count) {if (orderType 1) {// 充值 500if (isPay true) {// 充值成功console.log(中奖100元)} else {if (count > 0) {c…...

238. 银河英雄传说

Powered by:NEFU AB-IN Link 文章目录238. 银河英雄传说题意思路代码238. 银河英雄传说 题意 有一个划分为 N列的星际战场&#xff0c;各列依次编号为 1,2,…,N 有 N艘战舰&#xff0c;也依次编号为 1,2,…,N&#xff0c;其中第 i号战舰处于第 i列。 有 T条指令&#xff0c;每…...

centos7 开机自启动自定义脚本

centos7 开机自启动自定义脚本背景配置自启动jar1.首先书写自启动脚本2.在rc.local中加入脚本reboot测试docker版本的自启动背景 项目中有遇到2个问题&#xff0c; 1&#xff1a; 使用java启动jar包 2&#xff1a; docker容器中自启动个服务。 这2个都要使用linux的开机自启动问…...

【Linux】动静态库的制作

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;动静库和静…...

数据备份学习笔记2

Linux实现本地备份的命令&#xff1a; mkdir -p /root/backup/date "%Y-%m-%d" tar -zcvPf /root/backup/date "%Y-%m-%d"/test20230221.tar.gz /root/test20230221/ 我们再看下tar命令选项&#xff1a; tar -czvf txt3.tar.gz txt3 tar -xvf txt4.tar.g…...

webRTC

WebRTC是一种实时通信技术&#xff0c;可以在浏览器中实现音频、视频和数据的实时传输。WebRTC使用标准的API和协议&#xff0c;如RTCPeerConnection和RTCDataChannel等&#xff0c;可以实现点对点通信和多方会议等多种应用场景。WebRTC可以应用于Web前端、移动端和桌面端等多种…...

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道&#xff0c;毕竟前几年刚发布的时候曾火遍全网&#xff0c;甚至都做成表情包了。 问题在于&#xff0c;凭什么认为这就是黑洞的照片&#xff0c;而不是一个甜甜圈啥的给整模糊了得到的呢&#xff1f;有什么理论依据吗&…...

Spring MVC常用功能及注解

目录 一、什么是Spring MVC 1.1 Spring MVC定义 1.2 MVC定义 1.3 MVC和Spring MVC的关系 1.4 Spring MVC的作用 二、Spring MVC的使用 2.1 Spring MVC的创建和连接 2.1.1 RequestMapping注解 2.1.2 GetMapping注解 2.1.3 PostMapping注解 2.2 获取参数 2.2.1 获取单…...

shell 编程

文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除&#xff08;d 命令&#xf…...

Leetcode.1401 圆和矩形是否有重叠

题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating &#xff1a; 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)&#xff0c;其中 (x1, y1)是矩形左下角的坐标&#xff0c;而 (x2, y2)是右上角的坐标。 如果圆和矩…...

CHAPTER 3 Web Server - httpd配置(二)

Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例&#xff1a;1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…...

VSCode 连接 SSH 服务器

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129133964 配置VSCode 下载VSCode:https://code.visualstudio.com/ 安装 Remote - SSH: 点击右下角蓝色图标: 连接服务器: 即可。 默认连接:ssh chen…...

如何选择靠谱的插画培训课程

如何选择靠谱的插画培训课程&#xff0c;今天教你3个维度选择一个靠谱的插画培训班&#xff01; 插画培训机构课程&#xff1a; 1.选择插画培训班时&#xff0c;要先考察课程&#xff0c;看看课程内容是否符合自己的需求&#xff0c;是否有助于提高插画技术。课程设置应该灵活…...

剑指 Offer 28. 对称的二叉树

剑指 Offer 28. 对称的二叉树 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...