公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~ NumPy(Numerical Python)是Python的一个开源的数值计算扩展,它提供了高效的多维数组对象ndarray,以及大量的数学函数库,用于处理大型矩阵和数组运算。

机器学习最底层库Numpy的70个知识点,刷爆!

NumPy的主要特点包括擅长数值计算、足够高的运算能力、支持矢量化运算,并且是免费、开源的。

本文由浅入深的介绍70个Numpy的知识点,助你快速入门Numpy!最后一个知识点真的不容忽视!

官方学习地址:numpy.org/

导入numpy

import numpy as np  # 国际惯例

查看版本

np.__version__
'1.24.3'

创建空数组

np.array([])
array([], dtype=float64)

创建全0一维数组

A1 = np.zeros(5)
A1
array([0., 0., 0., 0., 0.])

和下面的代码是功能类似,但是非完全等价:

A2 = np.array([0,0,0,0,0])
A2
array([0, 0, 0, 0, 0])

二者的区别看下面:

A1.dtype  # np.zeros
dtype('float64')
A2.dtype  # np.array
dtype('int32')

创建非0一维数组

np.array([1,2,3,4,5])
array([1, 2, 3, 4, 5])

创建全0二维数组

np.zeros((5,5))
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

创建全1二维数组

np.ones((3,5))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

创建非0二维数组

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

创建非0三维数组

np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
          [[10, 11, 12], [13, 14, 15], [16, 17, 18]]
         ])
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],
       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]]])

创建0-1随机数组

np.random.randn(2,3,2)  # 返回0-1之间的随机样本数
array([[[ 0.31828038,  0.7689764 ],
        [-0.45125297,  1.21648636],
        [ 0.64074149,  0.01148165]],
       [[ 0.3273331 , -0.99450869],
        [ 0.430959  ,  1.88978962],
        [ 0.40886625, -0.41752926]]])

创建正态分布数组

np.random.randn(4,5)  # 从标准正态分布(均值为0,标准差为1)中返回或填充数组
array([[-0.59880533, -0.4892546 , -0.11262313, -0.18888795, -0.29071441],
       [-0.81646124, -0.04868196, -0.6480912 ,  0.24923365, -0.52163335],
       [-1.76748905,  0.8424851 ,  0.77048079, -0.04080533,  1.85021566],
       [-0.20228951,  1.61593328,  0.9793867 , -0.09846424,  0.788601  ]])

基于np.arange创建数组

np.arange(10)  # 默认间隔是1;不包含10,从0开始
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0,20,2) # 2是间隔
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
np.arange(20,0,-2) # -2是间隔;包含20,不包含0
array([20, 18, 16, 14, 12, 10,  8,  6,  4,  2])

上面创建的是等差数列的数组;下面介绍创建等比数列的数组。

基于np.logspace创建数组

np.logspace(
    start,
    stop,
    num=50,
    endpoint=True,
    base=10.0,
    dtype=None,
    axis=0,
)
np.logspace(0,2,5)   # 默认以10为底;取5个点; 10^0=1  10^2=100
array([  1.        ,   3.16227766,  10.        ,  31.6227766 ,
       100.        ])
np.logspace(0,2,5,base=2)   # 以2为底;2^0=1, 2^2=4
array([1.        , 1.41421356, 2.        , 2.82842712, 4.        ])

基于np.linspace创建数组

np.linspace(1,10,50)  # 在1到10(包含1和10)等间隔取50个数
array([ 1.        ,  1.18367347,  1.36734694,  1.55102041,  1.73469388,
        1.91836735,  2.10204082,  2.28571429,  2.46938776,  2.65306122,
        2.83673469,  3.02040816,  3.20408163,  3.3877551 ,  3.57142857,
        3.75510204,  3.93877551,  4.12244898,  4.30612245,  4.48979592,
        4.67346939,  4.85714286,  5.04081633,  5.2244898 ,  5.40816327,
        5.59183673,  5.7755102 ,  5.95918367,  6.14285714,  6.32653061,
        6.51020408,  6.69387755,  6.87755102,  7.06122449,  7.24489796,
        7.42857143,  7.6122449 ,  7.79591837,  7.97959184,  8.16326531,
        8.34693878,  8.53061224,  8.71428571,  8.89795918,  9.08163265,
        9.26530612,  9.44897959,  9.63265306,  9.81632653, 10.        ])
np.linspace(1,9.9,20)  # 1到9.9取20个数
array([1.        , 1.46842105, 1.93684211, 2.40526316, 2.87368421,
       3.34210526, 3.81052632, 4.27894737, 4.74736842, 5.21578947,
       5.68421053, 6.15263158, 6.62105263, 7.08947368, 7.55789474,
       8.02631579, 8.49473684, 8.96315789, 9.43157895, 9.9       ])

创建shape相同的数组

arr1 = np.array([[1,2],[3,4],[5,6]])
arr1
array([[1, 2],
       [3, 4],
       [5, 6]])
arr1.shape
(3, 2)

创建3*2的全0数组:

np.zeros_like(arr1)
array([[0, 0],
       [0, 0],
       [0, 0]])

创建3*2的全1数组:

np.ones_like(arr1)
array([[1, 1],
       [1, 1],
       [1, 1]])

创建对角线为1,其他元素为0的数组

np.eye(5)  # 主对角线元素为1
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])
np.eye(5,3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.],
       [0., 0., 0.]])
np.eye(3,5)
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.]])

创建主对角线递增的数组

np.diag([1,2,3,4])
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])
np.diag(1 + np.arange(4))
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])
np.diag(np.arange(1,5))
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])

创建单位矩阵(数组)

np.identity(5)  # 等价于np.eye(5)  
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

上面介绍了多种数组创建方法,下面介绍数组的相关属性信息:

创建边界全1,内部全0的数组

Z = np.ones((5,5))  # 先创建全1
Z[1:-1,1:-1] = 0  # 再把中间部分设置为0
Z
array([[1., 1., 1., 1., 1.],
       [1., 0., 0., 0., 1.],
       [1., 0., 0., 0., 1.],
       [1., 0., 0., 0., 1.],
       [1., 1., 1., 1., 1.]])

创建边界全0,内部全1的数组

# 方式1
Z = np.zeros((5,5))  # 先创建全1
Z[1:-1,1:-1] = 1  # 再把中间部分设置为0
Z
array([[0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 0.],
       [0., 1., 1., 1., 0.],
       [0., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0.]])

介绍另一种实现方法:

numpy.pad(array, #  待填充数组
       pad_width,  # 填充宽度;可以是整数或者形状为(m,2)
       mode='constant',  # 填充模式,constant-常数填充  edge-边缘值填充  linear_ramp:线性斜坡填充
       **kwargs)
# 方式2
Z = np.ones((3,3))  # 3*3的矩阵  上下左右扩充2次
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
Z
array([[0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 0.],
       [0., 1., 1., 1., 0.],
       [0., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0.]])

创建时间数组

T = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
T
array(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04',
       '2016-07-05', '2016-07-06', '2016-07-07', '2016-07-08',
       '2016-07-09', '2016-07-10', '2016-07-11', '2016-07-12',
       '2016-07-13', '2016-07-14', '2016-07-15', '2016-07-16',
       '2016-07-17', '2016-07-18', '2016-07-19', '2016-07-20',
       '2016-07-21', '2016-07-22', '2016-07-23', '2016-07-24',
       '2016-07-25', '2016-07-26', '2016-07-27', '2016-07-28',
       '2016-07-29', '2016-07-30', '2016-07-31'], dtype='datetime64[D]')

获取昨日、今日、明日

yesterday = np.datetime64("today") - np.timedelta64(1)
today = np.datetime64("today")
tomorrow = np.datetime64("today") + np.timedelta64(1)
yesterday, today, tomorrow
(numpy.datetime64('2024-04-01'),
 numpy.datetime64('2024-04-02'),
 numpy.datetime64('2024-04-03'))

基于切片创建0101的间隔数组

基于切片的方式进行创建:

Z = np.zeros((8,8),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
Z
array([[0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0]])

基于np.tile创建0101间隔的数组

np.tile函数具有复制的功能:

np.tile(np.array([[0,1],[1,0]]), (4,4))
array([[0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0]])

查看数组元素个数

arr1   # 已创建arr1数组为例
array([[1, 2],
       [3, 4],
       [5, 6]])
arr1.size
6

查看单个元素所占字节数

arr1.itemsize
4

查看数组总字节数

(arr1.size) * (arr1.itemsize)  # 方式1
24
arr1.nbytes  # 方式2
24

查看数组维度ndim

arr1.ndim
2

查看数组shap

arr1.shape
(3, 2)

数组重塑reshape

arr1.reshape(2,3)  # 从3*2变成2*3
array([[1, 2, 3],
       [4, 5, 6]])

如果最后一个维度是-1,则numpy会自动推算该维度的值:

arr1.reshape(2,-1)  # 从3*2变成2*3
array([[1, 2, 3],
       [4, 5, 6]])
arr1.reshape(6,-1)  # 从3*2变成6*1
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

数组最大-小值

arr1.max(),arr1.min()
(6, 1)

数组均值

arr1.mean()
3.5
np.mean(arr1)  # 等价
3.5

数组转置

arr1  # 原数组
array([[1, 2],
       [3, 4],
       [5, 6]])
arr1.T
array([[1, 3, 5],
       [2, 4, 6]])
np.transpose(arr1)  # 等价
array([[1, 3, 5],
       [2, 4, 6]])

查看数组元素类型

arr1.dtype
dtype('int32')
arr2 = np.arange(16)
arr2
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
arr2.dtype
dtype('int32')

数组唯一值

np.unique(arr2)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])

下面介绍数组的相关操作:

数组切片操作

希望你有切片的基础知识,类比Python中列表的切片:

arr3 = np.arange(10)  # 创建arr3
arr3
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr3[:2]
array([0, 1])
arr3[::2]
array([0, 2, 4, 6, 8])
arr3[1:7:3]
array([1, 4])
arr3[1:7:]
array([1, 2, 3, 4, 5, 6])

定位数组中的元素

arr3[2]
2
arr3[2:4]
array([2, 3])
arr3[2:8:2]
array([2, 4, 6])

再看看arr1的操作:

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

从多维数组中定位到某个具体的元素:

arr1[1][0]  # 定位到具体的某个元素  
3
arr1[0:2]
array([[1, 2],
       [3, 4]])
arr1[0:2][1]
array([3, 4])

基于条件筛选数组中数据

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

修改数组中的元素

arr1
array([[1, 2],
       [3, 4],
       [5, 6]])
arr1[2][0] = 88   # 修改元素
arr1
array([[ 1,  2],
       [ 3,  4],
       [88,  6]])
arr2
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
arr2[3] = 33   # 修改单个元素
arr2
array([ 0,  1,  2, 33,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
arr2[4:13:2] = 88  # 同时修改多个元素
arr2
array([ 0,  1,  2, 33, 88,  5, 88,  7, 88,  9, 88, 11, 88, 13, 14, 15])

基于切片翻转数组

arr1[:,::-1]  # 沿着水平轴(列)翻转
array([[ 2,  1],
       [ 4,  3],
       [ 6, 88]])
arr1[::-1]  # 沿着垂直轴(行)翻转
array([[88,  6],
       [ 3,  4],
       [ 1,  2]])
arr2[::-1]
array([15, 14, 13, 88, 11, 88,  9, 88,  7, 88,  5, 88, 33,  2,  1,  0])

基于np.flip翻转数组

np.flip(arr1,axis=0)  # 水平
array([[88,  6],
       [ 3,  4],
       [ 1,  2]])
np.flip(arr1,axis=1)  # 垂直
array([[ 2,  1],
       [ 4,  3],
       [ 6, 88]])
np.flip(arr2)  # 翻转
array([15, 14, 13, 88, 11, 88,  9, 88,  7, 88,  5, 88, 33,  2,  1,  0])

数组元素排序

arr1
array([[ 1,  2],
       [ 3,  4],
       [88,  6]])
np.sort(arr1)  # 注意第三行
array([[ 1,  2],
       [ 3,  4],
       [ 6, 88]])
np.sort(arr2)
array([ 0,  1,  2,  5,  7,  9, 11, 13, 14, 15, 33, 88, 88, 88, 88, 88])

数组展平np.flatten

下面介绍3种展平的方式:

arr1.flatten()
array([ 1,  2,  3,  4, 88,  6])
arr1.ravel()
array([ 1,  2,  3,  4, 88,  6])
arr1.reshape(-1)  # reshape方法也可以的
array([ 1,  2,  3,  4, 88,  6])

数组复制np.repeat

arr1
array([[ 1,  2],
       [ 3,  4],
       [88,  6]])
np.repeat(arr1,2,axis=0)  # 行上复制
array([[ 1,  2],
       [ 1,  2],
       [ 3,  4],
       [ 3,  4],
       [88,  6],
       [88,  6]])
np.repeat(arr1, repeats=(1,2),axis=1)
array([[ 1,  2,  2],
       [ 3,  4,  4],
       [88,  6,  6]])
np.repeat(arr1, repeats=2,axis=1)
array([[ 1,  1,  2,  2],
       [ 3,  3,  4,  4],
       [88, 88,  6,  6]])
np.repeat(arr1, repeats=(2,2),axis=1)  # 等价上面的功能
array([[ 1,  1,  2,  2],
       [ 3,  3,  4,  4],
       [88, 88,  6,  6]])

数组标准化

arr1
array([[ 1,  2],
       [ 3,  4],
       [88,  6]])
arr1[2][0] = 5  # 修改数组的值
arr1
array([[1, 2],
       [3, 4],
       [5, 6]])
(arr1 - np.mean(arr1)) / (np.std(arr1))  # 减去均值/标准差
array([[-1.46385011, -0.87831007],
       [-0.29277002,  0.29277002],
       [ 0.87831007,  1.46385011]])

下面介绍数组的相关算术运算,需要保证两个数组的shape值是相同的:

计算数组元素相反数

np.negative(arr1)  # 求出相反数
array([[-1, -2],
       [-3, -4],
       [-5, -6]])

迭代数组元素

for x in np.nditer(arr1):  # np.nditer
    print(f"{x} n")
1
2 
3 
4 
5 
6 

数组相加

arr4 = np.random.random((3,2))  # 创建新数组arr4
arr1 + arr4
array([[1.54709168, 2.42505162],
       [3.79535707, 4.82221704],
       [5.9582225 , 6.38661785]])
np.add(arr1, arr4)
array([[1.54709168, 2.42505162],
       [3.79535707, 4.82221704],
       [5.9582225 , 6.38661785]])

数组相减

arr1 - arr4
array([[0.45290832, 1.57494838],
       [2.20464293, 3.17778296],
       [4.0417775 , 5.61338215]])
np.subtract(arr1, arr4)
array([[0.45290832, 1.57494838],
       [2.20464293, 3.17778296],
       [4.0417775 , 5.61338215]])

数组相乘

arr1 * arr4
array([[0.54709168, 0.85010324],
       [2.38607121, 3.28886814],
       [4.7911125 , 2.31970707]])
np.multiply(arr1, arr4)
array([[0.54709168, 0.85010324],
       [2.38607121, 3.28886814],
       [4.7911125 , 2.31970707]])

数组相除

arr1 / arr4
array([[ 1.82784722,  4.70531084],
       [ 3.77189078,  4.86489555],
       [ 5.21799478, 15.51920087]])
np.divide(arr1, arr4)
array([[ 1.82784722,  4.70531084],
       [ 3.77189078,  4.86489555],
       [ 5.21799478, 15.51920087]])

数组标准差

np.std(arr1)
1.707825127659933

数据协方差

np.cov(arr1)
array([[0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5]])

数组相关系数

np.corrcoef(arr1)
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

数组点乘

arr5 = np.random.random((2,3))
np.dot(arr1, arr5)  # np.dot函数  arr1:3*2   arr5:2*3
array([[1.31280195, 2.01163683, 1.20531935],
       [3.3419601 , 4.60736305, 3.28359212],
       [5.37111826, 7.20308927, 5.36186489]])
arr1 @ arr5  # @符号
array([[1.31280195, 2.01163683, 1.20531935],
       [3.3419601 , 4.60736305, 3.28359212],
       [5.37111826, 7.20308927, 5.36186489]])

数组内积

arr1.shape, arr4.shape
((3, 2), (3, 2))
np.inner(arr1, arr4)  # shape必须相同
array([[1.39719492, 2.43979114, 1.73145819],
       [3.34148151, 5.67493936, 4.42113888],
       [5.2857681 , 8.91008757, 7.11081957]])

数组外积

np.outer(arr1, arr4)
array([[0.54709168, 0.42505162, 0.79535707, 0.82221704, 0.9582225 ,
        0.38661785],
       [1.09418335, 0.85010324, 1.59071414, 1.64443407, 1.916445  ,
        0.77323569],
       [1.64127503, 1.27515486, 2.38607121, 2.46665111, 2.8746675 ,
        1.15985354],
       [2.1883667 , 1.70020648, 3.18142828, 3.28886814, 3.83289   ,
        1.54647138],
       [2.73545838, 2.1252581 , 3.97678535, 4.11108518, 4.7911125 ,
        1.93308923],
       [3.28255005, 2.55030972, 4.77214243, 4.93330222, 5.749335  ,
        2.31970707]])

数组笛卡尔积

np.cross(arr1, arr4)
array([-0.66913173, -0.71477718, -3.81624577])

数组乘积

np.matmul(arr1, arr5)   # arr1:3*2   arr5:2*3
array([[1.31280195, 2.01163683, 1.20531935],
       [3.3419601 , 4.60736305, 3.28359212],
       [5.37111826, 7.20308927, 5.36186489]])

数组堆叠

np.stack((arr1, arr4),axis=0)  # shape必须相同
array([[[1.        , 2.        ],
        [3.        , 4.        ],
        [5.        , 6.        ]],
       [[0.54709168, 0.42505162],
        [0.79535707, 0.82221704],
        [0.9582225 , 0.38661785]]])
np.stack((arr1, arr4),axis=1)  # shape必须相同
array([[[1.        , 2.        ],
        [0.54709168, 0.42505162]],
       [[3.        , 4.        ],
        [0.79535707, 0.82221704]],
       [[5.        , 6.        ],
        [0.9582225 , 0.38661785]]])

数组拼接np.concatenate

np.concatenate((arr1, arr4))
array([[1.        , 2.        ],
       [3.        , 4.        ],
       [5.        , 6.        ],
       [0.54709168, 0.42505162],
       [0.79535707, 0.82221704],
       [0.9582225 , 0.38661785]])
np.concatenate((arr1, arr4),axis=0)
array([[1.        , 2.        ],
       [3.        , 4.        ],
       [5.        , 6.        ],
       [0.54709168, 0.42505162],
       [0.79535707, 0.82221704],
       [0.9582225 , 0.38661785]])
np.concatenate((arr1, arr4),axis=1)
array([[1.        , 2.        , 0.54709168, 0.42505162],
       [3.        , 4.        , 0.79535707, 0.82221704],
       [5.        , 6.        , 0.9582225 , 0.38661785]])

请对比np.concatenate和np.stack的差异。

数组拆分hsplit

arr1
array([[1, 2],
       [3, 4],
       [5, 6]])
a1,a2 = np.hsplit(arr1,2)
a1,a2
(array([[1],
        [3],
        [5]]),
 array([[2],
        [4],
        [6]]))
a1, a2, a3 = np.vsplit(arr1,3)
a1, a2, a3
(array([[1, 2]]), array([[3, 4]]), array([[5, 6]]))

数组轴操作

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

沿着不同轴进行求和操作:

np.sum(arr1,axis=0)  # 行
array([ 9, 12])
np.sum(arr1,axis=1)  # 列
array([ 3,  7, 11])

数组(矩阵)求逆

arr2
array([ 0,  1,  2, 33, 88,  5, 88,  7, 88,  9, 88, 11, 88, 13, 14, 15])
arr6 = arr2.reshape(4,4)
arr6
array([[ 0,  1,  2, 33],
       [88,  5, 88,  7],
       [88,  9, 88, 11],
       [88, 13, 14, 15]])
np.linalg.inv(arr6)  # 必须是方阵
array([[-0.00071023,  0.03888494, -0.04101563,  0.01349432],
       [-0.03125   , -0.25865709,  0.25950169, -0.00084459],
       [ 0.        , -0.01351351,  0.02702703, -0.01351351],
       [ 0.03125   ,  0.00865709, -0.00950169,  0.00084459]])

计算数组(矩阵)行列式

np.linalg.det(arr6)
833536.0000000005

计算数组(矩阵)特征值-特征向量

eigenvalues, eigenvectors = np.linalg.eig(arr6)
print(eigenvalues) # 特征值
print("-- -- -- -- -- -- -- -- -- -- -- --")
print(eigenvectors) # 特征向量
[113.3145257  -42.68891086  41.52414534  -4.14976018]
-- -- -- -- -- -- -- -- -- -- -- --
[[-0.09766391 -0.5501368  -0.31735959  0.15061916]
 [-0.65998532  0.38654348  0.58278912 -0.98727434]
 [-0.69293239  0.28636445  0.5952845  -0.04907753]
 [-0.27336028  0.68258995 -0.45307405  0.01395139]]

数组(矩阵)QR分解

Q,R = np.linalg.qr(arr6)
Q,R
(array([[ 0.00000000e+00,  1.74077656e-01, -3.39028144e-01,
         -9.24530631e-01],
        [-5.77350269e-01, -6.96310624e-01,  3.40911633e-01,
         -2.56119972e-01],
        [-5.77350269e-01,  9.56145736e-18, -7.66580303e-01,
          2.81107286e-01],
        [-5.77350269e-01,  6.96310624e-01,  4.25668669e-01,
         -2.49873143e-02]]),
 array([[-152.42047107,  -15.58845727, -109.69655115,  -19.05255888],
        [   0.        ,    5.74456265,  -51.17883085,   11.31504764],
        [   0.        ,    0.        ,  -32.17753781,  -10.8489006 ],
        [   0.        ,    0.        ,    0.        ,  -29.58498019]]))

数组(矩阵)SVD分解

U, S, V = np.linalg.svd(arr6)
print(U)
print(S)
print(V)
[[-0.0232873   0.14804949  0.98499497  0.08558017]
 [-0.6423276  -0.30731117 -0.02994316  0.70148307]
 [-0.64587667 -0.2733831   0.08728697 -0.70745035]
 [-0.41196636  0.89939028 -0.14584001  0.01056106]]
[192.71510128  49.8301378   32.41413832   2.67782409]
[[-0.77635336 -0.07473923 -0.6184055  -0.09625044]
 [ 0.562817    0.1573971  -0.76687592  0.26526306]
 [-0.24025519 -0.00848575  0.15346653  0.95846411]
 [ 0.15096335 -0.98466654 -0.07696735  0.04144757]]

提取数组元素整数部分

A = np.random.uniform(0,10,10)   # 用于生成一个或多个服从均匀分布的随机数
A
array([3.25354619, 4.79481347, 6.33674704, 1.29666394, 6.60022014,
       2.12721195, 5.67791331, 0.65022945, 6.63628911, 7.04403907])
A - A % 1  # A % 1 表示求余数部分
array([3., 4., 6., 1., 6., 2., 5., 0., 6., 7.])
A // 1  # 求商
array([3., 4., 6., 1., 6., 2., 5., 0., 6., 7.])
np.floor(A)
array([3., 4., 6., 1., 6., 2., 5., 0., 6., 7.])
A.astype(int)
array([3, 4, 6, 1, 6, 2, 5, 0, 6, 7])
np.trunc(A)
array([3., 4., 6., 1., 6., 2., 5., 0., 6., 7.])

无穷与空值(np.inf、np.nan)

np.nan  # 空值
nan
np.inf  # 无穷
inf

1、0乘以空值仍然是空值,不是0!

0 * np.nan
nan

2、0乘以无穷仍然是空值,不是0!

0 * np.inf
nan

3、两个空值竟然不相等!!!

np.nan == np.nan
False

4、两个无穷值是相等的!

np.inf == np.inf
True

5、无穷比空值大或小,竟然都是不对的!

np.inf > np.nan
False
np.inf < np.nan
False

6、两个空值(无穷值)相减竟然都是空值!!!

np.nan - np.nan
nan
np.inf - np.inf
nan

希望本文的内容对你有所帮助。如果觉得还不错,欢迎点赞,转发。