Python中Numpy的应用技巧

目录

  • 1. 什么是 NumPy?
  • 2. NumPy 中的数组
    • 2.1. 创建数组
    • 2.2. 用Numpy的数据
      • 2.2.1. OpenCV
      • 2.2.2. Pandas
  • 3. 数学计算
    • 3.1. 四则计算
      • 3.1.1. 矩阵乘法
      • 3.1.2. 点乘
    • 3.2. 求逆矩阵与伪逆矩阵
    • 3.3. 判断矩阵相等
    • 3.4. np.eye()函数生成对角阵
  • 4. 统计
    • 4.1. 最大值、最小值、均值+条件
    • 4.2. numpy.ptp()最大值与最小值的差
  • 5. 其他
    • 5.1. 删除空值与布尔屏蔽
    • 5.2. numpy 将uint8转换为int16
    • 5.3. 沿轴向连接数组
    • 5.4. 如何计算两组数的欧式距离
    • 5.5. 如何计算numpy数组的移动平均值

1. 什么是 NumPy?

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词-- Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:

  • 机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

  • 图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

  • 数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

2. NumPy 中的数组

NumPy提供的最重要的数据结构是一个称为NumPy数组的强大对象。NumPy数组是通常的Python数组的扩展。NumPy数组配备了大量的函数和运算符,可以帮助我们快速编写上面讨论过的各种类型计算的高性能代码。

NumPy围绕这些称为数组的事物展开。实际上它被称之为 ndarrays,使用NumPy提供的这些数组,我们就可以以闪电般的速度执行各种有用的操作,如矢量和矩阵、线性代数等数学运算!

矩阵类似于矢量,除了它由行和列组成; 很像一个网格。可以通过给出它所在的行和列来引用矩阵中的值。在NumPy中,我们通过传递一系列序列来制作数组,就像我们之前所做的那样。

在这里插入图片描述

2.1. 创建数组

import numpy as np
a = [[1,2],[10,30],[100,200]]
b = np.array(a)
print(b)
	[[  1   2][ 10  30][100 200]]
c = np.zeros((2,3))
	array([[0., 0., 0.],[0., 0., 0.]])
d = np.ones((2,3))
	array([[1., 1., 1.],[1., 1., 1.]])

2.2. 用Numpy的数据

2.2.1. OpenCV

import numpy as np
import cv2img=cv2.imread('img\heart1.JPG')
h,w,l=img.shape

2.2.2. Pandas

import pandas as pddf = pd.DataFrame(b,columns=['a','b'])
print(df)
df.values
	     a    b0    1    21   10   302  100  200array([[  1,   2],[ 10,  30],[100, 200]])

3. 数学计算

3.1. 四则计算

使用四则运算符 +、- 、*、/ 来完成运算操作。乘法运算符执行逐元素乘法而不是矩阵乘法。 要执行矩阵乘法,你可以执行以下操作。

3.1.1. 矩阵乘法

  • 概念:矩阵乘法是指两个矩阵进行乘法运算的过程。
  • 运算方法:若 A A A m × n m\times n m×n的矩阵, B B B n × p n\times p n×p的矩阵,则其乘积 C = A × B C=A\times B C=A×B m × p m\times p m×p的矩阵。其中, C C C的第 i i i行、第 j j j列元素的计算方法为 C i , j = ∑ k = 1 n A i , k × B k , j C_{i,j}=\sum_{k=1}^{n}A_{i,k}\times B_{k,j} Ci,j=k=1nAi,k×Bk,j
  • 特点:
    • 矩阵乘法不满足交换律,即 A × B ≠ B × A A\times B\ne B\times A A×B=B×A
    • 矩阵乘法满足结合律,即 ( A × B ) × C = A × ( B × C ) (A\times B)\times C=A\times (B\times C) (A×B)×C=A×(B×C)
    • 矩阵乘法可以用于矩阵的变换。

A × B = [ A 11 A 12 A 21 A 22 A 31 A 32 ] × [ B 11 B 12 B 21 B 22 ] = [ A 11 B 11 + A 12 B 21 A 11 B 21 + A 12 B 22 A 21 B 11 + A 22 B 21 A 21 B 21 + A 22 B 22 A 31 B 11 + A 32 B 21 A 31 B 21 + A 32 B 22 ] A \times B=\begin{bmatrix} A_{11} & A_{12}\\ A_{21} & A_{22}\\ A_{31} & A_{32} \end{bmatrix} \times \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{bmatrix} = \begin{bmatrix} A_{11}B_{11} + A_{12}B_{21} & A_{11}B_{21} + A_{12}B_{22}\\ A_{21}B_{11} + A_{22}B_{21} & A_{21}B_{21} + A_{22}B_{22}\\ A_{31}B_{11} + A_{32}B_{21} & A_{31}B_{21} + A_{32}B_{22} \end{bmatrix} A×B= A11A21A31A12A22A32 ×[B11B21B12B22]= A11B11+A12B21A21B11+A22B21A31B11+A32B21A11B21+A12B22A21B21+A22B22A31B21+A32B22

numpy的dot()函数称为点积。

在这里插入图片描述

3.1.2. 点乘

  • 概念:点乘是指两个向量逐一对应的元素相乘,并将结果相加的过程。
  • 运算方法:若 A = ( a 1 , a 2 , a 3 , … , a n ) A=(a_1,a_2,a_3,\dots,a_n) A=(a1,a2,a3,,an) B = ( b 1 , b 2 , b 3 , … , b n ) B=(b_1,b_2,b_3,\dots,b_n) B=(b1,b2,b3,,bn)为两个 n n n维向量,则其点乘 C = A ⋅ B C=A\cdot B C=AB为一个标量,其计算方法为 C = ∑ i = 1 n a i × b i C=\sum_{i=1}^{n}a_i\times b_i C=i=1nai×bi
  • 特点:
    • 点乘满足交换律,即 A ⋅ B = B ⋅ A A\cdot B=B\cdot A AB=BA
    • 点乘也称为内积,可以用于计算向量的模长和向量之间的夹角。
    • 点乘也可以用于计算两个向量之间的相似度。

A × B = [ A 11 A 12 A 21 A 22 ] × [ B 11 B 12 B 21 B 22 ] = [ A 11 B 11 A 12 B 12 A 21 B 21 A 22 B 22 ] A \times B=\begin{bmatrix} A_{11} & A_{12}\\ A_{21} & A_{22} \end{bmatrix} \times \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{bmatrix} = \begin{bmatrix} A_{11}B_{11} & A_{12}B_{12}\\ A_{21}B_{21} & A_{22}B_{22} \end{bmatrix} A×B=[A11A21A12A22]×[B11B21B12B22]=[A11B11A21B21A12B12A22B22]

例如:

import numpy as npa = np.array([[1,2],[4,5]])
b = np.array([[1,2],[3,4]])
c = np.dot(a,b)       # 矩阵乘法,点积
d = np.multiply(a,b)  # 矩阵叉乘,点乘
e = a@b
f = a*b
print('c=e',c)
print('d=f',d)
	c=e [[ 7 10][19 28]]d=f [[ 1  4][12 20]]

3.2. 求逆矩阵与伪逆矩阵

逆矩阵概念:设 A A A是一个n阶矩阵,若存在另一个n阶矩阵 B B B,使得: A B = B A = E AB=BA=E AB=BA=E ,则称方阵 A A A可逆,并称方阵 B B B A A A的逆矩阵,不是所有的矩阵都存在逆矩阵的,但有时候不得不用到,举个例子:

A X = B AX=B AX=B,则: X = A − 1 B X=A^{-1}B X=A1B

A A A可逆的时候完全没问题,但是当 A A A不可逆的时候只能用pinv求伪逆矩阵,照样能得到结果,但是存在一定的误差,不能忽略。

import numpy as npa = np.array([[1, 0, 0],[0, 6, 0],[0, 0, 9]])
print('\n', np.linalg.inv(a))  # 求逆矩阵
print('\n', np.linalg.pinv(a))  # 求伪逆矩阵,当本身就可逆的时候,二者结果相同b = np.array([[1, 4, 1, 5]])
print('\n', np.linalg.pinv(b))
print('\n', b @ np.linalg.pinv(b))  # 可以看到伪逆矩阵的性质还是使它们俩相乘为E
	 [[1.         0.         0.        ][0.         0.16666667 0.        ][0.         0.         0.11111111]][[1.         0.         0.        ][0.         0.16666667 0.        ][0.         0.         0.11111111]][[0.02325581][0.09302326][0.02325581][0.11627907]][[1.]]

3.3. 判断矩阵相等

numpy中的allclose函数用于比较两个数组是否相等。

例如逆矩阵运算,判断是否相等。

import numpy as npa = np.array([[1., 2.], [3., 4.]])
ainv = np.linalg.inv(a)
np.allclose(np.dot(a, ainv), np.eye(2))
	True

正常情况下,np.allclose会按照元素在数组中的顺序依次进行比较。例如:

import numpy as np
a = np.array([1, 2, 3])
b = np.array([1, 2, 3])
c = np.array([3, 2, 1])
print(np.allclose(a, b)) # True
print(np.allclose(a, c)) # False

3.4. np.eye()函数生成对角阵

函数的原型:numpy.eye(N,M=None,k=0,dtype=<class ‘float’>,order='C)

返回的是一个二维2的数组(N,M),对角线的地方为1,其余的地方为0.

参数介绍:

  • N:int型,表示的是输出的行数
  • M:int型,可选项,输出的列数,如果没有就默认为N
  • k:int型,可选项,对角线的下标,默认为0表示的是主对角线,负数表示的是低对角,正数表示的是高对角。
  • dtype:数据的类型,可选项,返回的数据的数据类型
  • order:{‘C’,‘F’},可选项,也就是输出的数组的形式是按照C语言的行优先’C’,还是按照Fortran形式的列优先‘F’存储在内存中
import numpy as npa=np.eye(3)
print(a)a=np.eye(4,k=1)
print(a)
	[[1. 0. 0.][0. 1. 0.][0. 0. 1.]][[0. 1. 0. 0.][0. 0. 1. 0.][0. 0. 0. 1.][0. 0. 0. 0.]]

深度学习中的高级用法,将数组转成one-hot形式。

import numpy as nplabels=np.array([[1],[2],[0],[1]])
print("labels的大小:",labels.shape,"\n")#因为我们的类别是从0-2,所以这里是3个类
a=np.eye(3)[2]
print("如果对应的类别号是2,那么转成one-hot的形式",a,"\n")res=np.eye(3)[labels.reshape(-1)]
print("labels转成one-hot形式的结果:\n",res,"\n")
	labels的大小: (4, 1) 如果对应的类别号是2,那么转成one-hot的形式 [0. 0. 1.] labels转成one-hot形式的结果:[[0. 1. 0.][0. 0. 1.][1. 0. 0.][0. 1. 0.]] 

4. 统计

4.1. 最大值、最小值、均值+条件

Numpy的min()函数语法如下:

numpy.min(a, axis=None, out=None, keepdims=, initial=, where=)
其中:

  • a:数组。
  • axis:沿着哪个轴计算最小值,默认为None,表示对整个数组求最小值。
  • out:输出数组,用于存储计算结果。
  • keepdims:是否保持数组的维度,默认为False,即降维处理。
  • initial:初始值,表示在数组中没有元素时的返回值。
  • where:条件,只有条件为True的元素才参与计算。

例如:二维数组的最小值
接着,我们来看一个二维数组,求出数组的最小值。

import numpy as npa = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
min_value = np.min(a, axis=1)print(min_value)

输出结果为:[1 4 7]

在这个例子中,我们传递了axis=1参数,表示我们要沿着第二个轴(也就是每一行)求最小值。最终输出的结果是每一行的最小值,形成一个一维数组。注意,这个结果是通过降维得到的。

4.2. numpy.ptp()最大值与最小值的差

numpy.ptp() 函数计算数组中元素最大值与最小值的差(最大值 - 最小值)。

numpy.ptp(a, axis=None, out=None, keepdims=, initial=, where=)
参数说明:

  • a: 输入的数组,可以是一个 NumPy 数组或类似数组的对象。
  • axis: 可选参数,用于指定在哪个轴上计算峰-峰值。如果不提供此参数,则返回整个数组的峰-峰值。可以是一个整数表示轴的索引,也可以是一个元组表示多个轴。
  • out: 可选参数,用于指定结果的存储位置。
  • keepdims: 可选参数,如果为 True,将保持结果数组的维度数目与输入数组相同。如果为 False(默认值),则会去除计算后维度为1的轴。
  • initial: 可选参数,用于指定一个初始值,然后在数组的元素上计算峰-峰值。
  • where: 可选参数,一个布尔数组,用于指定仅考虑满足条件的元素。
import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]])  
print ('我们的数组是:')
print (a)
print ('调用 ptp() 函数:')
print (np.ptp(a))
print ('沿轴 1 调用 ptp() 函数:')
print (np.ptp(a, axis =  1))
print ('沿轴 0 调用 ptp() 函数:')
print (np.ptp(a, axis =  0))
	我们的数组是:[[3 7 5][8 4 3][2 4 9]]			调用 ptp() 函数:7		沿轴 1 调用 ptp() 函数:[4 5 7]		沿轴 0 调用 ptp() 函数:[6 3 6]

5. 其他

5.1. 删除空值与布尔屏蔽

布尔屏蔽是一个有用的功能,它允许我们根据我们指定的条件检索数组中的元素。

首先,查找NaN值的位置,可以使用函数np.isnan()查找NaN值的位置。接着移除NaN值,使用函数np.delete()删除NaN值所在的索引位置。

import numpy as np a = np.array([[3,np.nan,5],[8,4,np.nan],[2,4,9]])  
a
	array([[ 3., nan,  5.],[ 8.,  4., nan],[ 2.,  4.,  9.]])
mask = np.isnan(a)
print(mask)# 使用布尔索引数组来选择非空值的行
non_empty_rows = np.logical_not(np.any(mask, axis=1))
#a = np.delete(a, np.where(mask))
print(non_empty_rows)
# 生成一个不含空值的新数组
cleaned_data = a[non_empty_rows]
print(cleaned_data)
	[[False  True False][False False  True][False False False]][False False  True][[2. 4. 9.]]

其中,np.logical_not这是一个逻辑函数,可按元素计算NOT arr的真值。

5.2. numpy 将uint8转换为int16

例如图像数据,dat.astype(np.int16)。

5.3. 沿轴向连接数组

import numpy as npa = [0 , 1, 2, 3, 4, 5]
# list转numpy数组
a1 = np.array(a)
print(a1)
# 重新调整数据/矩阵为二维
a2 = a1.reshape(3,2)
print(a2)
# 沿着新轴连接数组/矩阵,增加一个维度,形成三维数组/矩阵/向量
a3 = np.stack((a2,a2,a2), axis=2)     
print(a3)
print(a3.shape)# 一维转变为三维
a4 = a1.reshape(3,2,1)
print(a4)
	[0 1 2 3 4 5][[0 1][2 3][4 5]][[[0 0 0][1 1 1]][[2 2 2][3 3 3]][[4 4 4][5 5 5]]](3, 2, 3)

5.4. 如何计算两组数的欧式距离

# Input
a = np.array([1,2,3,4,5])
b = np.array([4,5,6,7,8])# Solution
dist = np.linalg.norm(a-b)
dist
# > 6.7082039324993694

5.5. 如何计算numpy数组的移动平均值

对于给定的一维数组,计算窗口大小为3的移动平均值。

def moving_average(a, n=3) :ret = np.cumsum(a, dtype=float)ret[n:] = ret[n:] - ret[:-n]return ret[n - 1:] / nnp.random.seed(100)
Z = np.random.randint(10, size=10)
print('array: ', Z)
# Method 1
moving_average(Z, n=3).round(2)# Method 2:  # Thanks AlanLRH!
# np.ones(3)/3 gives equal weights. Use np.ones(4)/4 for window size 4.
np.convolve(Z, np.ones(3)/3, mode='valid') # > array:  [8 8 3 7 7 0 4 2 5 2]
# > moving average:  [ 6.33  6.    5.67  4.67  3.67  2.    3.67  3.  ]

参考:

https://www.numpy.org.cn/article/basics/understanding_numpy.html
https://www.numpy.org.cn/article/basics/an_introduction_to_scientific_python_numpy.html
https://www.numpy.org.cn/article/basics/numpy_matrices_vectors.html
https://www.numpy.org.cn/article/advanced/numpy_exercises_for_data_analysis.html
https://www.runoob.com/numpy/numpy-statistical-functions.html
若oo尘. 【Python之numpy库】3.np.linalg.pinv和np.linalg.inv 求逆矩阵与伪逆矩阵. CSDN博客. 2020.11
鸣谦12. 矩阵和向量的点乘与叉乘. CSDN博客. 2021.04

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Python 中如何向列表或数组添加元素

在这篇文章中&#xff0c;你将了解 Python 中的 .append() 方法。你还会看到 .append() 与其他用于向列表添加元素的方法有什么不同。 让我们开始吧&#xff01; Python 中的列表是什么&#xff1f;给初学者的定义 编程中的数组是一个有序的项目集合&#xff0c;所有的项目都…

【Linux-常用命令-基础命令-解压rar文件-unrar-x-命令-笔记】

【Linux-常用命令-基础命令-解压rar文件-unrar-x-命令-笔记】 1、前言2、操作3、自己的操作 1、前言 最近&#xff0c;在使用Linux的时&#xff0c;使用相关基础命令是&#xff0c;总是容易忘记&#xff0c;上网一搜&#xff0c;大部分都写的比较繁琐&#xff0c;解压不同文件…

XCode15与iOS17/17.1 真机测试问题处理

XCode15与iOS17/17.1 真机测试问题处理&#xff0c;网上相关博客很多&#xff0c;摘录了如下实践后能起作用的地址如下&#xff1a;Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下&#xff1a;Assertion failure in void _UIGraphicsBeginImag…

Linux编译内核添加Bcache模块

由于Bcache是在linux kernel 3.10之后才加入的&#xff0c;所以要使用Bcache&#xff0c;首先必须确保内核版本至少是3.10或及以上&#xff0c;可以使用uname -a查看内核版本 [rootceph01 ~]# uname -a Linux ceph01 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC…

在Linux中,怎么查看自己电脑的系统架构是什么?

2023年10月18日&#xff0c;周三晚上 这些命令会返回一个字符串&#xff0c;表示系统的架构。 常见的架构包括 x86&#xff08;32位&#xff09;、x86_64&#xff08;64位&#xff09;、ARM 等。 方法1&#xff1a;使用uname命令 uname -m方法2&#xff1a;使用arch命令 ar…

如何查看前端项目vue版本

&#xff08;1&#xff09;点击package.json文件 &#xff08;2&#xff09;找到dependencies下面的value &#xff08;2&#xff09;查看vue版本 2开头为vue2 3开头为vue3

从零开始了解协同OA办公系统,一篇文章就够了!

随着现代企业管理的不断发展&#xff0c;越来越多的企业开始关注协同OA办公系统&#xff0c;以提高工作效率和降低成本。但是&#xff0c;很多企业对协同OA办公系统并不了解&#xff0c;甚至不知道该如何开始使用。本文将从零开始&#xff0c;为大家详细介绍协同OA办公系统。 一…

【数据结构】排序算法的稳定性分析

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java使用javah命令:‘javah‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

前提是已安装jdk&#xff0c;配置JDK环境变量&#xff0c;并成功输出下图&#xff1a; 但在命令行窗口使用javah&#xff0c;找不到该命令&#xff1a; 原因&#xff1a;新版的Java不使用javah的命令了&#xff0c;而是使用javac -h 用法&#xff1a; javac -h <directory&…

软件测试全套教程,软件测试自学线路图

目录 一、简介 二、引言 为什么要做接口自动化测试&#xff1f; 为什么要自己写框架呢&#xff1f; 三、环境准备 四、测试接口准备 接口代码 接口信息 五、编写接口测试 测试思路 脚本实现 六、优化 封装接口调用 保持cookies&增加log信息 封装重复操作 七…

微信隐秘功能:如何巧妙隐藏好友和消息的方法教程

在日常使用微信的过程中&#xff0c;难免会有些私密内容或特定的联系人和群聊希望能够暂时隐藏起来&#xff0c;以保护个人隐私。幸运的是&#xff0c;微信提供了一些内置功能以及额外的工具&#xff0c;能够帮助我们实现这一目的。下面就来详细介绍一种简单易行的方法&#xf…

软件考试学习笔记(希赛)

软考学习笔记-软件设计师 1. 软考基本介绍1.1 软考分数制1.2软考考试分类介绍1.3软件考试报名网站1.4考试内容1.4.1上午考试内容-综合知识1.4.2下午考试内容-软件设计 2.数据的表示2.1进制转换2.1.1R进制------》十进制转换2.1.2十进制-----》R进制转换2.1.3二进制与八进制与16…

低代码如何赋能实体经济走向数实融合

数字工厂、智慧园区、智慧社区、数字乡村、智慧校园、数字化管理平台……当前&#xff0c;各行各业正在全面拥抱数字化。“数实融合”的浪潮持续高涨&#xff0c;企业数字化转型的呼声也不断走高。然而&#xff0c;当前实体经济和数字经济融合不全&#xff0c;数字技术未能深度…

SpringBoot+自定义注解+AOP高级玩法打造通用开关

1.项目结构 2.引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot<…

MySQL 查询 唯一约束 对应的字段,列名称合并

MySQL 查询 唯一约束 对应的字段&#xff0c;列名称合并 SELECT F.DbName,F.TableName,F.ConstraintName,GROUP_CONCAT(ColumnName) ColumnName FROM ( SELECT t1.TABLE_SCHEMA DbName, t1.TABLE_NAME TableName,t1.CONSTRAINT_NAME ConstraintName,t2.COLUMN_NAME ColumnNam…

UI自动化测试的痛点

当我们找工作的时候查看招聘信息发现都需要有自动化测试经验&#xff0c;由此看来测试人员不会一点自动化测试技术都不好意思说自己是做软件测试的。大部分测试人员也都是从使用自动化测试工具、录制回放、测试脚本、开发小工具入门自动化测试的&#xff0c;然后在慢慢的接触 U…

Rust-类型转换进阶

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 关于Rust的类型转换&#xff…

美国绿氢项目开发商NovoHydrogen完成2000万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国科罗拉多州戈尔登的绿氢项目开发商NovoHydrogen今日宣布已完成2000万美元融资。 本轮融资由现代能源公司领投。 该公司打算利用这笔资金进一步扩大其团队&#xff0c;并将其绿氢项目的…

纳米软件科普:开关电源测试方案之如何测试短路保护

开关电源短路保护测试是通过模拟短路状态来检测电源在短路时是否有保护能力&#xff0c;是开关电源一个重要测试项目。通过测试&#xff0c;不仅可以测试开关电源的保护能力&#xff0c;还可以保护电路系统以及对设备的保护&#xff0c;防止受到损坏。那么短路保护要如何测试呢…

Linux创建与删除用户

Linux创建与删除用户 新增用户&#xff1a; adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户&#xff1a; userdel -r 用户名【删除用户】