大数据:NumPy进阶应用详解

news2024/11/17 17:50:54

专栏介绍

结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来!

全部文章请访问专栏:《Python全栈教程(0基础)》
再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对近年高频测试相关面试题做详细解答,结合自己多年工作经验,以及同行大佬指导总结出来的。旨在帮助测试、python方面的同学,顺利通过面试,拿到自己满意的offer!


文章目录

    • 专栏介绍
    • NumPy进阶应用
      • 数组的运算
        • 数组跟标量的运算
        • 数组跟数组的运算
        • 通用一元函数
        • 通用二元函数
        • 广播机制
      • 其他常用函数
      • 矩阵运算
        • 线性代数快速回顾
        • NumPy中矩阵相关函数
        • NumPy的线性代数模块


NumPy进阶应用

数组的运算

使用 NumPy 最为方便的是当需要对数组元素进行运算时,不用编写循环代码遍历每个元素,所有的运算都会自动的矢量化(使用高效的、提前编译的底层代码来对数据序列进行数学操作)。简单的说就是,NumPy 中的数学运算和数学函数会自动作用于数组中的每个成员。

数组跟标量的运算

代码:

array35 = np.arange(1, 10)
print(array35 + 10)
print(array35 * 10)

输出:

[11 12 13 14 15 16 17 18 19]
[10 20 30 40 50 60 70 80 90]

数组跟数组的运算

代码:

array36 = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
print(array35 + array36)
print(array35 * array36)
print(array35 ** array36)

输出:

[ 2  3  4  6  7  8 10 11 12]
[ 1  2  3  8 10 12 21 24 27]
[  1   2   3  16  25  36 343 512 729]

通用一元函数

通用函数是对ndarray中的数据执行元素级运算的函数。你可以将其看做普通函数(接收一个标量值作为参数,返回一个标量值)的矢量化包装器,如下所示。

代码:

print(np.sqrt(array35))
print(np.log2(array35))

输出:

[1.         1.41421356 1.73205081 2.         2.23606798 2.44948974
 2.64575131 2.82842712 3.        ]
[0.         1.         1.5849625  2.         2.32192809 2.5849625
 2.80735492 3.         3.169925  ]

表1:通用一元函数

函数说明
abs / fabs求绝对值的函数
sqrt求平方根的函数,相当于array ** 0.5
square求平方的函数,相当于array ** 2
exp计算 e x e^x ex的函数
log / log10 / log2对数函数(e为底 / 10为底 / 2为底)
sign符号函数(1 - 正数;0 - 零;-1 - 负数)
ceil / floor上取整 / 下取整
isnan返回布尔数组,NaN对应True,非NaN对应False
isfinite / isinf判断数值是否为无穷大的函数
cos / cosh / sin三角函数
sinh / tan / tanh三角函数
arccos / arccosh / arcsin反三角函数
arcsinh / arctan / arctanh反三角函数
rint / round四舍五入函数

通用二元函数

代码:

array37 = np.array([[4, 5, 6], [7, 8, 9]])
array38 = np.array([[1, 2, 3], [3, 2, 1]])
print(array37 ** array38)
print(np.power(array37, array38))

输出:

[[  4  25 216]
 [343  64   9]]
[[  4  25 216]
 [343  64   9]]

表2:通用二元函数

函数说明
add(x, y) / substract(x, y)加法函数 / 减法函数
multiply(x, y) / divide(x, y)乘法函数 / 除法函数
floor_divide(x, y) / mod(x, y)整除函数 / 求模函数
allclose(x, y)检查数组xy元素是否几乎相等
power(x, y)数组 x x x的元素 x i x_i xi和数组 y y y的元素 y i y_i yi,计算 x i y i x_i^{y_i} xiyi
maximum(x, y) / fmax(x, y)两两比较元素获取最大值 / 获取最大值(忽略NaN)
minimum(x, y) / fmin(x, y)两两比较元素获取最小值 / 获取最小值(忽略NaN)
dot(x, y)点积运算(数量积,通常记为 ⋯ \cdots ,用于欧几里得空间(Euclidean space))
inner(x, y)内积运算(内积的含义要高于点积,点积相当于是内积在欧几里得空间$$的特例,而内积可以推广到赋范向量空间,只要它满足平行四边形法则即可)
cross(x, y) 叉积运算(向量积,通常记为 × \times ×,运算结果是一个向量)
outer(x, y)外积运算(张量积,通常记为 ⨂ \bigotimes ,运算结果通常是一个矩阵)
intersect1d(x, y)计算xy的交集,返回这些元素构成的有序数组
union1d(x, y)计算xy的并集,返回这些元素构成的有序数组
in1d(x, y)返回由判断x 的元素是否在y中得到的布尔值构成的数组
setdiff1d(x, y)计算xy的差集,返回这些元素构成的数组
setxor1d(x, y)计算xy的对称差,返回这些元素构成的数组

补充说明:在二维空间内,两个向量 A = [ a 1 a 2 ] \boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \end{bmatrix} A=[a1a2] B = [ b 1 b 2 ] \boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \end{bmatrix} B=[b1b2]的叉积是这样定义的: A × B = ∣ a 1 a 2 b 1 b 2 ∣ = a 1 b 2 − a 2 b 1 \boldsymbol{A}\times \boldsymbol{B}=\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}=a_1b_2 - a_2b_1 A×B= a1a2b1b2 =a1b2a2b1,其中 ∣ a 1 a 2 b 1 b 2 ∣ \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} a1a2b1b2 称为行列式。但是一定要注意,叉积并不等同于行列式,行列式的运算结果是一个标量,而叉积运算的结果是一个向量。如果不明白,我们可以看看三维空间两个向量, A = [ a 1 a 2 a 3 ] \boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} A= a1a2a3 B = [ b 1 b 2 b 3 ] \boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} B= b1b2b3 的叉积是 < i ^ ∣ a 2 a 3 b 2 b 3 ∣ , − j ^ ∣ a 1 a 3 b 1 b 3 ∣ , k ^ ∣ a 1 a 2 b 1 b 2 ∣ > \left< \hat{i} \begin{vmatrix} a_2 \quad a_3 \\ b_2 \quad b_3 \end{vmatrix}, -\hat{j} \begin{vmatrix} a_1 \quad a_3 \\ b_1 \quad b_3 \end{vmatrix}, \hat{k} \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} \right> i^ a2a3b2b3 ,j^ a1a3b1b3 ,k^ a1a2b1b2 ,其中 i ^ , j ^ , k ^ \hat{i}, \hat{j}, \hat{k} i^,j^,k^代表每个维度的单位向量。

广播机制

上面的例子中,两个二元运算的数组形状是完全相同的,我们再来研究一下,两个形状不同的数组是否可以直接做二元运算或使用二元函数进行运算,请看下面的例子。

代码:

array39 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
array40 = np.array([1, 2, 3])
array39 + array40

输出:

array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

代码:

array41 = np.array([[1], [2], [3], [4]])
array39 + array41

输出:

array([[1, 1, 1],
       [3, 3, 3],
       [5, 5, 5],
       [7, 7, 7]])

通过上面的例子,我们发现形状不同的数组仍然有机会进行二元运算,但也绝对不是任意的数组都可以进行二元运算。简单的说,只有两个数组后缘维度相同或者其中一个数组后缘维度为1时,广播机制会被触发,而通过广播机制如果能够使两个数组的形状一致,才能进行二元运算。所谓后缘维度,指的是数组shape属性对应的元组中最后一个元素的值(从后往前数最后一个维度的值),例如,我们之前打开的图像对应的数组后缘维度为3,3行4列的二维数组后缘维度为4,而有5个元素的一维数组后缘维度为5。简单的说就是,后缘维度相同或者其中一个数组的后缘维度为1,就可以应用广播机制;而广播机制如果能够使得数组的形状一致,就满足了两个数组对应元素做运算的需求,如下图所示。


其他常用函数

除了上面讲到的函数外,NumPy 中还提供了很多用于处理数组的函数,ndarray对象的很多方法也可以通过直接调用函数来实现,下表给出了一些常用的函数。

表3:NumPy其他常用函数

函数说明
unique去除数组重复元素,返回唯一元素构成的有序数组
copy返回拷贝数组得到的数组
sort返回数组元素排序后的拷贝
split / hsplit / vsplit将数组拆成若干个子数组
stack / hstack / vstack将多个数组堆叠成新数组
concatenate沿着指定的轴连接多个数组构成新数组
append / insert向数组末尾追加元素 / 在数组指定位置插入元素
argwhere找出数组中非0元素的位置
extract / select / where按照指定的条件从数组中抽取或处理数组元素
flip沿指定的轴翻转数组中的元素
fromiter通过迭代器创建数组对象
fromregex通过读取文件和正则表达式解析获取数据创建数组对象
repeat / tile通过对元素的重复来创建新数组
roll沿指定轴对数组元素进行移位
resize重新调整数组的大小
place / put将数组中满足条件的元素/指定的元素替换为指定的值
partition用选定的元素对数组进行一次划分并返回划分后的数组

提示:上面的resize函数和ndarray对象的resize方法是有区别的,resize函数在调整数组大小时会重复数组中的元素作为填补多出来的元素的值,而ndarry对象的resize方法是用0来填补多出来的元素。这些小细节不清楚暂时也不要紧,但是如果用到对应的功能了就要引起注意。

代码:

array42 = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
array43 = np.array([[4, 4, 4], [5, 5, 5], [6, 6, 6]])
np.hstack((array42, array43))

输出:

array([[1, 1, 1, 4, 4, 4],
       [2, 2, 2, 5, 5, 5],
       [3, 3, 3, 6, 6, 6]])

代码:

np.vstack((array42, array43))

输出:

array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5],
       [6, 6, 6]])

代码:

np.concatenate((array42, array43))

输出:

array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5],
       [6, 6, 6]])

代码:

np.concatenate((array42, array43), axis=1)

输出:

array([[1, 1, 1, 4, 4, 4],
       [2, 2, 2, 5, 5, 5],
       [3, 3, 3, 6, 6, 6]])

矩阵运算

NumPy 中提供了专门用于线性代数(linear algebra)的模块和表示矩阵的类型matrix,当然我们通过二维数组也可以表示一个矩阵,官方并不推荐使用matrix类而是建议使用二维数组,而且有可能在将来的版本中会移除matrix类。无论如何,利用这些已经封装好的类和函数,我们可以轻松愉快的实现线性代数中很多的操作。

线性代数快速回顾

  1. 向量也叫矢量,是一个同时具有大小和方向,且满足平行四边形法则的几何对象。与向量相对的概念叫标量数量,标量只有大小、绝大多数情况下没有方向。
  2. 向量可以进行数乘点积叉积等运算。
  3. 行列式由向量组成,它的性质可以由向量解释。
  4. 行列式可以使用行列式公式计算: d e t ( A ) = ∑ n ! ± a 1 α a 2 β ⋯ a n ω det(\boldsymbol{A})=\sum_{n!} \pm {a_{1\alpha}a_{2\beta} \cdots a_{n\omega}} det(A)=n!±a1αa2βa
  5. 高阶行列式可以用代数余子式展开成多个低阶行列式,如: d e t ( A ) = a 11 C 11 + a 12 C 12 + ⋯ + a 1 n C 1 n det(\boldsymbol{A})=a_{11}C_{11}+a_{12}C_{12}+ \cdots +a_{1n}C_{1n} det(A)=a11C11+a12C12++a1nC1n
  6. 矩阵是由一系列元素排成的矩形阵列,矩阵里的元素可以是数字、符号或数学公式。
  7. 矩阵可以进行加法减法数乘乘法转置等运算。
  8. 逆矩阵 A − 1 \boldsymbol{A^{-1}} A1表示, A A − 1 = A − 1 A = I \boldsymbol{A}\boldsymbol{A^{-1}}=\boldsymbol{A^{-1}}\boldsymbol{A}=\boldsymbol{I} AA1=A1A=I;没有逆矩阵的方阵是奇异矩阵
  9. 如果一个方阵是满秩矩阵(矩阵的秩等于矩阵的阶数),该方阵对应的线性方程有唯一解。

说明矩阵的秩是指矩阵中线性无关的行/列向量的最大个数,同时也是矩阵对应的线性变换的像空间的维度。

NumPy中矩阵相关函数

  1. 创建矩阵对象。

    代码:

    # matrix构造函数可以传入类数组对象也可以传入字符串
    m1 = np.matrix('1 2 3; 4 5 6')
    m1
    

    输出:

    matrix([[1, 2, 3],
            [4, 5, 6]])
    

    代码:

    # asmatrix函数也可以写成mat函数,它们其实是同一个函数
    m2 = np.asmatrix(np.array([[1, 1], [2, 2], [3, 3]]))
    m2
    

    输出:

    matrix([[1, 1],
            [2, 2],
            [3, 3]])
    

    代码:

    m1 * m2
    

    输出:

    matrix([[14, 14],
            [32, 32]])
    

    说明:注意matrix对象和ndarray对象乘法运算的差别,如果两个二维数组要做矩阵乘法运算,应该使用@运算符或matmul函数,而不是*运算符。

  2. 矩阵对象的属性。

    属性说明
    A获取矩阵对象对应的ndarray对象
    A1获取矩阵对象对应的扁平化后的ndarray对象
    I可逆矩阵的逆矩阵
    T矩阵的转置
    H矩阵的共轭转置
    shape矩阵的形状
    size矩阵元素的个数
  3. 矩阵对象的方法。

矩阵对象的方法跟之前讲过的ndarray数组对象的方法基本差不多,此处不再进行赘述。

NumPy的线性代数模块

NumPy 的linalg模块中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的函数,它们跟 MATLAB 和 R 等语言所使用的是相同的行业标准线性代数库,下面的表格列出了numpy以及linalg模块中常用的跟线性代数相关的函数。

函数说明
diag以一维数组的形式返回方阵的对角线元素或将一维数组转换为方阵(非对角元素元素为0)
vdot向量的点积
dot数组的点积
inner数组的内积
outer数组的叉积
trace计算对角线元素的和
norm求模(范数)运算
det计算行列式的值(在方阵上计算会得到一个标量)
matrix_rank计算矩阵的秩
eig计算矩阵的特征值(eigenvalue)和特征向量(eigenvector)
inv计算非奇异矩阵( n n n阶方阵)的逆矩阵
pinv计算矩阵的摩尔-彭若斯(Moore-Penrose)广义逆
qrQR分解(把矩阵分解成一个正交矩阵与一个上三角矩阵的积)
svd计算奇异值分解(singular value decomposition)
solve解线性方程组 A x = b \boldsymbol{A}\boldsymbol{x}=\boldsymbol{b} Ax=b,其中 A \boldsymbol{A} A是一个方阵
lstsq计算 A x = b \boldsymbol{A}\boldsymbol{x}=\boldsymbol{b} Ax=b的最小二乘解

大家如果有兴趣可以用下面的代码验证上面的函数。

代码:

m3 = np.array([[1., 2.], [3., 4.]])
np.linalg.inv(m3)

输出:

array([[-2. ,  1. ],
       [ 1.5, -0.5]])

代码:

m4 = np.array([[1, 3, 5], [2, 4, 6], [4, 7, 9]])
np.linalg.det(m4)

输出:

2

代码:

# 解线性方程组ax=b
# 3*x1 + x2= 9,x1 + 2*x2 = 8
a = np.array([[3,1], [1,2]])
b = np.array([9, 8])
np.linalg.solve(a, b)

输出:

array([2., 3.])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP ABAPG开发屏幕自动生成日期的搜索帮助

代码如下&#xff1a; REPORT z_jason_test_f4 . TABLES: s031. PARAMETER p_spmon TYPE spmon DEFAULT sy-datum0(6) OBLIGATORY. SELECT-OPTIONS s_spmon FOR s031-spmon DEFAULT sy-datum0(6) OBLIGATORY. AT SELECTION-SCREEN ON VALUE-REQUEST…

SDK 自动化测试方案

测试背景 SDK 具有上百个接口&#xff0c;测试场景、测试用例繁多&#xff0c;对于修改某个模块的代码或 SDK 上线前均需要投入大量资源&#xff08;人力、时间&#xff09;进行回归验证。目前 QA 资源有限&#xff0c;希望通过梳理 SDK 的功能&#xff0c;尝试使用自动化测试…

【论文阅读】CONAN:一种实用的、高精度、高效的APT实时检测系统(TDSC-2020)

CONAN&#xff1a;A Practical Real-Time APT Detection System With High Accuracy and Efficiency TDSC-2020 浙江大学 Xiong C, Zhu T, Dong W, et al. CONAN: A practical real-time APT detection system with high accuracy and efficiency[J]. IEEE Transactions on Dep…

点破ResNet残差网络的精髓

卷积神经网络在实际训练过程中&#xff0c;不可避免会遇到一个问题&#xff1a;随着网络层数的增加&#xff0c;模型会发生退化。    换句话说&#xff0c;并不是网络层数越多越好&#xff0c;为什么会这样&#xff1f; 不是说网络越深&#xff0c;提取的特征越多&#xff…

登陆接口的的Filter过滤

目录 一、概述 二、基本操作 三、登陆检查接口 一、概述 什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能 使用了过滤器之后&#xff0…

基于Java+SpringBoot的房源出租信息管理系统【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推…

微信删除的聊天记录怎么恢复?满满干货,建议收藏!

微信的出现逐渐改变了我们的社交方式&#xff0c;它架起了我们与朋友、家人以及同事之间的沟通桥梁&#xff0c;成为我们生活中不可缺失的一部分。 但是总会有那么点意外会发生&#xff0c;比如自己和朋友吵架了&#xff0c;一怒之下将朋友删除&#xff0c;导致所有聊天记录都…

2分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…

ubuntu18.04安装远程控制软件ToDest方法,针对官网指令报错情况

有时我们在家办公&#xff0c;需要控制实验室的笔记本&#xff0c;因此好用的远程控制软件会让我们的工作事半功倍&#xff01; 常用的远程控制软件有ToDesk&#xff0c;向日葵&#xff0c;以及TeamViewer&#xff0c;但是为感觉ToDesk更流畅一些&#xff0c;所以这里介绍一下…

C++新经典07--auto、头文件防卫、引用与常量

auto的使用 严格来讲&#xff0c;在C语言中&#xff0c;如果某个函数中需要用到一些局部变量&#xff0c;那么局部变量都会集中定义在函数开头&#xff0c;而在C中不必遵循这样的规则&#xff0c;随时用随时定义即可。当然&#xff0c;作用域一般就是从定义的地方开始到该函数…

人工智能引领图文扫描新趋势

1. 背景和影响 近日&#xff0c;中国大学生服务外包创新创业大赛决赛在江南大学圆满落幕。为满足现代服务产业企业的现实需求&#xff0c;本次竞赛内容设计充分聚焦企业发展中所面临的技术、管理等现实问题&#xff0c;与产业的结合度更紧密&#xff0c;智能文字识别技术是大赛…

6款必备的办公软件,个个好用到爆,让你电脑成为真正利器

在现代办公环境中&#xff0c;电脑已经成为我们必不可少的工作工具。而要发挥电脑的最大作用&#xff0c;就需要借助一些优秀的办公软件。下面&#xff0c;就来介绍五款必备的办公软件&#xff0c;它们个个好用到爆&#xff0c;让你的电脑成为真正的利器&#xff01; 文件快速搜…

性能优越的静电监控系统是怎样的?

随着社会的发展&#xff0c;各种监控系统应运而生。静电监控系统是其中之一。它具有优异的性能和稳定性&#xff0c;能够有效地检测和发现静电。 1&#xff1a;静电监控系统的优势 静电监控系统是一种先进的自动化控制系统&#xff0c;它能够有效地检测和控制企业运营中的各种…

【Java从0到1学习】10 Java常用类汇总

1. System类 System类对读者来说并不陌生&#xff0c;因为在之前所学知识中&#xff0c;需要打印结果时&#xff0c;使用的都是“System.out.println();”语句&#xff0c;这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法&#xff0c;它所提供的属性和…

条码通讯配置

由Leuze&#xff08;劳易测&#xff09; LSIS 222 M5M-R1/MA208i系统组成 连接说明及器件明细&#xff1a; 打开条码调试软件BPS Configuration tool对M208i进行ip 和端口号进行配置&#xff0c;条码选择作为客户端&#xff0c;输入ip和端口号&#xff0c;选择串口通讯波特…

基于java校园二手交易平台-lw-源码

二手交易平台论文 源码 文章目录 前言一、主要技术javaMysql数据库JSP技术B/S结构 二、系统设计三、功能截图总结 前言 随着社会的不断发展与进步&#xff0c;人们对信息科学化的认识越来越深入&#xff0c;管理工作的重要性逐渐被认识到。科学化的管理能够实现信息存储的准确…

【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图

作品概况 页面数量&#xff1a;共 110 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;外卖配送、生鲜配送 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为外卖订餐骑手端APP原型设计图&#x…

nodejs+vue+elementui实验室课程预约管理系统 t1g73

通过前面的功能分析可以将实验室课程管理系统的功能分为管理员、学生和教师三个部分&#xff0c;系统的主要功能包括首页、个人中心、教师管理、学生管理、教师课表管理、实验室信息管理、实验课程管理、预约记录管理、实验成绩管理、设备信息管理、借用记录管理、归还记录管理…

解决云服务连接时长过短,不到一会儿自动断开

我们在使用xshell或者FinalShell连接云服务器操作时&#xff0c;总是十分钟就自动断开&#xff0c;很烦&#xff0c; 下面我们设置一下&#xff0c;让他可以使用很长时间&#xff08;需要有一定的linux命令的基础&#xff09; cd /etc/ssh 进入到ssh这个目录&#xff0c;查看…

node使用高版本的oracledb导致连接oracle的Error: NJS-138异常

异常信息如下 Error: NJS-138: connections to this database server version are not supported by node-oracledb in Thin mode 我的oracle版本是11g&#xff0c;之前的使用正常&#xff0c;今天却报错了&#xff0c;显示不支持thin模式&#xff0c;后面回退版本就可以了。