学习 Python 之 NumericalPython库

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 学习 Python 之 NumericalPython库,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

学习 Python 之 NumericalPython库

NumericalPython库

什么是NumericalPython库?

NumericalPython库是使用 Python 进行科学计算的基础软件包, 它提供了 Python 生态系统中数据分析、机器学习、科学计算

除了计算外,它还包括了:

  1. 功能强大的 N 维数组对象
  2. 精密广播功能函数
  3. 集成 C/C+和 Fortran 代码的工具
  4. 强大的线性代数、傅立叶变换和随机数功能

NumPy 主要对象

NumPy的主要对象是同构多维数组

它是一个元素表(通常是数字), 所有类型都相同,由非负整数元组索引。在NumPy维度中称为 轴(axes)

例如: 3D空间中的点的坐标[1, 2, 1]具有一个轴。该轴有3个元素,所以我们说它的长度为3

在下图所示的例子中,数组有2个轴。第一轴的长度为2,第二轴的长度为3

实际上, 轴(axes)是数组的维度, 对于二维, 行是一个轴, 列是一个轴

[[ 1., 0., 0.],
 [ 0., 1., 2.]]

ndarray 对象

NumPy的数组类叫做 ndarray

ndarray属性

属性名 作用 备注
.ndim 数组的维度个数
.shape 数组的维度 这是一个整数的元组, 表示每个维度中数组的大小; 对于有 n 行和 m 列的矩阵, shape 将是 (n, m)
.size 数组元素的总数 对于有 n 行和 m 列的矩阵,shape 将是 n × m
.dtype 数组元素的类型 可以使用标准的Python类型创建或指定dtype, 也可以是NumPy提供的类型
.itemsize 数组中每个元素的字节大小 例如: 元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为 4(=32/8)
.data 该缓冲区包含数组的实际元素 通常, 我们不需要使用此属性, 因为我们将使用索引访问数组中的元素
.flags 数组对象的内存信息
.real 数组元素的实数部分
.imag 数组元素的虚数部分

ndarray 创建

创建函数

函数 作用
array(元素列表, 类型 = None) 使用列表创建数组, 默认类型 int32
zeros(元组, 类型) 创建0数组, 元组用来指定维度, 默认类型 float64
zeros_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的零数组, 可以指定数组的类型
ones(元组, 类型) 创建1数组, 元组用来指定维度, 默认类型 float64
ones_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的1数组, 可以指定数组的类型
empty(元组, 类型) 创建随机值数组, 元组用来指定维度, 默认类型 float64
empty_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的随机值数组, 可以指定数组的类型
arange(起始值, 终止值, 步长 = 1) 根据步长创建数组, 步长默认值为1, 支持浮点类型, 由于有限的浮点精度, 通常不可能预测所获得的元素的数量, 出于这个原因, 最好使用linspace()函数
arange(终止值) 步长为1, 起始值为0, 创建数组
linspace(起始值, 终止值, 元素个数) 根据元素个数创建数组
fromfunction(表达式或函数, 维度元组, dtype = None) 根据一个表达式创建数组
函数 作用
set_printoptions(threshold = sys.maxsize) 打印数组不跳过数组的中心部分, 即全部打印

1. 使用array() 函数

函数 作用
array(元素列表, 类型 = None) 使用列表创建数组, 默认情况类型为int32
import numpy

a = numpy.array([1, 2, 3, 4])
b = numpy.array([[1, 2], [3, 4.0]])
c = numpy.array([[1, 2], [3, 4]], dtype = complex)
print(a)
print(b)
print(c)
print(a.dtype, b.dtype, c.dtype)

结果:

[1 2 3 4]
[[1. 2.]
 [3. 4.]]
[[1.+0.j 2.+0.j]
 [3.+0.j 4.+0.j]]
int32 float64 complex128

2. 快捷创建数组

函数 作用
zeros(元组, 类型) 创建0数组, 元组用来指定维度, 默认情况下, 类型是float64
zeros_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的零数组, 可以指定数组的类型
ones(元组, 类型) 创建1数组, 元组用来指定维度, 默认情况下, 类型是float64
ones_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的1数组, 可以指定数组的类型
empty(元组, 类型) 创建随机值数组, 元组用来指定维度, 默认情况下, 类型是float64
empty_like(数组, 类型 = None) 创建与给定数组具有相同形状和类型的随机值数组, 可以指定数组的类型
full(元组, 填充值, 类型 = None) 创建数组中全部值都一样的数组, 可以指定数组的类型. 默认情况下, 类型是int32
identity(矩阵的阶数, 类型 = None) 创建方阵单位矩阵, 可以指定数组的类型, 默认情况下, 类型是float64
eye(元组, k = 0(1开始的位置)) 创建方阵非单位矩阵, 可以指定数组的类型, 默认情况下, 类型是float64

(1). 0数组

zeros() 函数

创建元素全为0的数组

import numpy

o = numpy.zeros(5)
print(o)

结果:

[0. 0. 0. 0. 0.]
zeros_like() 函数

创建与给定数组具有相同形状和类型的零数组, 可以指定数组的类型

import numpy

o = numpy.array(
    [
        [0, 1, 2],
        [3, 4, 5]
    ]
)
a = numpy.zeros_like(o, float)
print(a)

结果:

[[0. 0. 0.]
 [0. 0. 0.]]

(2). 1数组

ones() 函数

创建元素全为1的数组

import numpy

e = numpy.ones((5, 5), dtype = complex)
print(e)

结果:

[[1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j]
 [1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j]
 [1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j]
 [1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j]
 [1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j]]
ones_like() 函数

创建与给定数组具有相同形状和类型的1数组, 可以指定数组的类型

import numpy

o = numpy.array(
    [
        [0, 1, 2],
        [3, 4, 5]
    ]
)
a = numpy.ones_like(o, complex)
print(a)

结果:

[[1.+0.j 1.+0.j 1.+0.j]
 [1.+0.j 1.+0.j 1.+0.j]]

(3). 随机值数组

empty() 函数

创建元素全部是随机产生值的数组

import numpy

e = numpy.empty((3, 5))
print(e)

结果:

[[ 3.68274928e-216  7.87345618e-312  7.87345611e-312  6.15650563e+292
   7.87345618e-312]
 [ 7.87345611e-312  2.64978910e+081  7.87345620e-312  7.87345611e-312
  -1.05477908e+120]
 [ 7.87345620e-312  7.87345597e-312 -9.42910864e+115  7.87345620e-312
   7.87345597e-312]]
empty_like() 函数

创建与给定数组具有相同形状和类型的随机值数组, 可以指定数组的类型

import numpy

o = numpy.array([1, 2])
a = numpy.empty_like(o, complex)
print(a)

结果:

[6.63123696e-315+0.0000000e+000j 7.29112202e-304-7.3874612e+104j]

(4). 全部值一样的数组

full() 函数

创建元素全部是一样的数组

import numpy

x = numpy.full((2, 2), 6, float)
print(x)

结果:

[[6. 6.]
 [6. 6.]]

(5). 单位矩阵

identity() 函数

创建方阵单位矩阵

import numpy

i = numpy.identity(3, dtype = float)
print(i)

结果:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
eye() 函数

创建非方阵单位矩阵

import numpy

a = numpy.eye(5)
print(a)

b = numpy.eye(4, 8)
print(b)

c = numpy.eye(3, 5, k = 3)
print(c)

结果:

[[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. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0.]]
 
[[0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0.]]

在这里插入图片描述

3. 使用arange() 函数

函数 作用
arange(起始值, 终止值, 步长 = 1) 根据步长创建数组, 步长默认值为1, 支持浮点类型, 由于有限的浮点精度, 通常不可能预测所获得的元素的数量, 出于这个原因, 通常最好使用linspace()函数
arange(终止值) 步长为1, 起始值为0, 创建数组
import numpy

a = numpy.arange(1, 10)
b = numpy.arange(1, 20, 5)
c = numpy.arange(0, 2, 0.3)
d = numpy.arange(10)
print(a)
print(b)
print(c)
print(d)

结果:

[1 2 3 4 5 6 7 8 9]
[ 1  6 11 16]
[0.  0.3 0.6 0.9 1.2 1.5 1.8]
[0 1 2 3 4 5 6 7 8 9]

4. 使用linspace() 函数

函数 作用
linspace(起始值, 终止值, 元素个数) 根据元素个数创建数组
import numpy

a = numpy.linspace(0, 1, 5)
b = numpy.linspace(1, 20, 5)
print(a)
print(b)

结果:

[0.   0.25 0.5  0.75 1.  ]
[ 1.    5.75 10.5  15.25 20.  ]

5. 使用fromfunction() 函数

函数 作用
fromfunction(表达式或函数, 维度元组, dtype = None) 根据一个表达式创建数组
import numpy

a = numpy.fromfunction(lambda x, y: x + y, (2, 2))
print(a)

结果:

[[0. 1.]
 [1. 2.]]

原理:

x的值会从0递增, y的值会从0递增

对于第i行元素, x的值都为i – 1

对于第j列元素, y的值都为j – 1

    y ->  0          1
x    
↓   
0    [[0 = 0 + 0  1 = 0 + 1]
1     [1 = 1 + 0  2 = 1 + 1]]

6. 使用random() 函数

函数 作用
random(维度元组) 创建一个指定维度的数组, 元素的值在0 – 1但不包含1
import numpy

a = numpy.random.random((3, 5))
print(a)

结果:

[[0.88387807 0.69756899 0.447521   0.9923293  0.61855725]
 [0.65555256 0.28584714 0.16432933 0.54858505 0.19058042]
 [0.55937544 0.12831352 0.96037035 0.35226674 0.51170598]]

原理:

x的值会从0递增, y的值会从0递增

对于第i行元素, x的值都为i – 1

对于第j列元素, y的值都为j – 1

    y ->  0          1
x    
↓   
0    [[0 = 0 + 0  1 = 0 + 1]
1     [1 = 1 + 0  2 = 1 + 1]]

7. print() 函数打印数组

函数 作用
set_printoptions(threshold = sys.maxsize) 打印数组不跳过数组的中心部分, 即全部打印

如果数组太大而无法打印,NumPy会自动跳过数组的中心部分并只打印头部元素和尾部元素

import numpy

a = numpy.arange(1, 9999)
print(a)
a = [i for i in range(1, 9999)]
b = numpy.array([a, a])
print(b)

结果:

[   1    2    3 ... 9996 9997 9998]
[[   1    2    3 ... 9996 9997 9998]
 [   1    2    3 ... 9996 9997 9998]]

元素不省略打印

使用 set_printoptions() 函数

import numpy
import sys


a = numpy.arange(1, 9999)
print(a)
numpy.set_printoptions(threshold = sys.maxsize)
print(a)

结果:

[   1    2    3 ... 9996 9997 9998]
[   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   27   28
   29   30   31   32   33   34   35   36   37   38   39   40   41   42
   43   44   45   46   47   48   49   50   51   52   53   54   55   56
   ... 这里省略打印结果

ndarray 运算

运算符与运算函数

运算符 解释 作用
+ 加法 数组对应元素相加
+= 相加赋值 数组对应元素相加并赋值
- 减法 数组对应元素相减
-= 相减赋值 数组对应元素相减并赋值
** 对数组中每个元素进行幂运算, 如果是A ** B, 则A的幂为B中对应位置的元素值
** 幂再赋值 对数组中每个元素进行幂并赋值
* 数乘 对数组中每个元素进行相乘
*= 数乘赋值 对数组中每个元素进行相乘并赋值
> 大于 数组对应元素比较大小
< 小于 数组对应元素比较大小
>= 大于等于 数组对应元素比较大小
<= 小于等于 数组对应元素比较大小
== 等于 数组对应元素比较大小
!= 不等于 数组对应元素比较大小

当使用不同类型的数组进行操作时, 结果数组的类型对应于更一般或更精确的数组, 即称为向上转型

1. 加 减 幂 数乘

运算符 解释 作用
+ 加法 数组对应元素相加
+= 相加赋值 数组对应元素相加并赋值
- 减法 数组对应元素相减
-= 相减赋值 数组对应元素相减并赋值
** 对数组中每个元素进行幂运算, 如果是A ** B, 则A的幂为B中对应位置的元素值
** 幂再赋值 对数组中每个元素进行幂并赋值
* 数乘 对数组中每个元素进行相乘
*= 数乘赋值 对数组中每个元素进行相乘并赋值

(1). 加减

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
b = numpy.array(
    [
        [2, 2],
        [3, 3]
    ]
)
print(a)
print(b)
c = a + b
d = a - b
print(c)
print(d)

结果:

[[1 2]
 [3 4]]
[[2 2]
 [3 3]]
[[3 4]
 [6 7]]
[[-1  0]
 [ 0  1]]

(2). 幂

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
b = a ** 2
print(a)
print(b)
a **= a
print(a)

结果:

[[1 2]
 [3 4]]
[[ 1  4]
 [ 9 16]]
[[  1   4]
 [ 27 256]]

(3). 数乘

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
b = a * 3
print(a)
print(b)

结果:

[[1 2]
 [3 4]]
[[ 3  6]
 [ 9 12]]

2. 比较

运算符 解释 作用
> 大于 数组对应元素比较大小
< 小于 数组对应元素比较大小
>= 大于等于 数组对应元素比较大小
<= 小于等于 数组对应元素比较大小
== 等于 数组对应元素比较大小
!= 不等于 数组对应元素比较大小

(1). 与数比较

结果是相同维度的布尔数组

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
print(a > 3)
print(a >= 3)
print(a < 3)
print(a <= 3)
print(a == 3)
print(a != 3)

结果:

[[False False]
 [False  True]]
 
[[False False]
 [ True  True]]
 
[[ True  True]
 [False False]]
 
[[ True  True]
 [ True False]]
 
[[False False]
 [ True False]]
 
[[ True  True]
 [False  True]]

(2). 与同型数组比较

结果是相同维度的布尔数组

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
b = numpy.array(
    [
        [4, 4],
        [4, 4]
    ]
)
print(a > b)
print(a >= b)
print(a < b)
print(a <= b)
print(a == b)
print(a != b)

结果:

[[False False]
 [False False]]
 
[[False False]
 [False  True]]
 
[[ True  True]
 [ True False]]
 
[[ True  True]
 [ True  True]]
 
[[False False]
 [False  True]]
 
[[ True  True]
 [ True False]]

(3). 不同型数组比较

结果是布尔数组

多维度与1维度

1维度扩展为与多维度同型

import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
b = numpy.array(
    [
        [0]
    ]
)
print(a)
print(b)
print(a == b)

结果:

[[1 2]
 [3 4]]
[[0]]
[[False False]
 [False False]]
多维度与某一维度相同

多维度数组与某一维度相同的数组比较, 后者会扩展为与多维度数组同型的数组

import numpy

a = numpy.array(
    [
        [1, 3],
        [3, 1]
    ]
)
b = numpy.array(
    [
        [1],
        [1]
    ]
)
c = numpy.array(
    [
        [1, 1]
    ]
)
print(a)
print(a == b)
print(a == c)

结果:

[[1 3]
 [3 1]]
[[ True False]
 [False  True]]
[[ True False]
 [False  True]]

3. 运算

运算符或函数 作用
@ 矩阵乘法
dot() 数组点乘
.sum(axis = None) 计算数组元素和, axis指定轴(维度)
.min(axis = None) 计算数组元素最大值, axis指定轴(维度)
.max(axis = None) 计算数组元素最小值, axis指定轴(维度)

(1). 乘法

矩阵乘法
import numpy

a = numpy.array(
    [
        [1, 3],
        [3, 1]
    ]
)
b = numpy.array(
    [
        [1, 0],
        [0, 1]
    ]
)
print(a)
print(b)
print(a @ b)

结果:

[[1 3]
 [3 1]]
[[1 0]
 [0 1]]
[[1 3]
 [3 1]]
数组点乘
  • 一维数组点乘

x = (a, b, c)

y = (d, e, f)

x·y = ad + be + cf

import numpy

a = numpy.array([1, 2, 3])
b = numpy.array([1, 3, 4])
print(a)
print(b)
print(numpy.dot(a, b))

结果:

[1 2 3]
[1 3 4]
19
  • 二维数组点乘

就是矩阵乘法, 与@效果一样

import numpy

a = numpy.array(
    [
        [1, 3],
        [3, 1]
    ]
)
b = numpy.array(
    [
        [1, 0],
        [0, 1]
    ]
)
print(a)
print(b)
print(numpy.dot(a, b))

结果:

[[1 3]
 [3 1]]
[[1 0]
 [0 1]]
[[1 3]
 [3 1]]

(2). sum() min() max() 函数

计算数组元素和

计算全部元素和
import numpy

a = numpy.array(
    [
        [1, 2],
        [3, 4]
    ]
)
print(a.sum())

结果:

10
计算某个维度的元素和
import numpy

a = numpy.array(
    [
        [1, 2.6],
        [3, 4.0]
    ]
)
# 计算列的和
print(a.sum(axis = 0))

结果:

[4 6]
min() 和 max() 与 sum() 用法一样

(3). 通函数

Numpy 提供好的一些数学函数

函数 作用
sin() 对数组每个元素取正弦
cos() 对数组每个元素取余弦
tan() 对数组每个元素取正切
exp() 对数组每个元素取自然指数

还有其他的这里不列举了

(4). 矩阵运算

在这里插入图片描述

ndarray 切片

1. 一维数组切片

跟Python 列表切片一样

2. 多维数组切片

(1). 切片

可以看成是列表的嵌套

使用,逗号分割轴(维度)

矩阵:

[[0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 0 0 0 7 8 9]
 [0 1 2 3 0 0 0 7 8 9]
 [0 1 2 3 0 0 0 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]]

使用切片取出矩阵中 3×3的零矩阵

import numpy

a = numpy.array(
[
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,0,0,0,7,8,9],
    [0,1,2,3,0,0,0,7,8,9],
    [0,1,2,3,0,0,0,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9]
]
)
b = a[4:7, 4:7]
print(b)

结果:

[[0 0 0]
 [0 0 0]
 [0 0 0]]

使用切片取出矩阵中 矩阵中 99 的元素

[[ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1 99  3 99  0 99  7 99  9]
 [ 0  1 99  3 99  0 99  7 99  9]
 [ 0  1  2  3  0  0  0  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]
 [ 0  1  2  3  4  5  6  7  8  9]]
import numpy

a = numpy.array(
[
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,99,3,99,0,99,7,99,9],
    [0,1,99,3,99,0,99,7,99,9],
    [0,1,2,3,0,0,0,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9],
    [0,1,2,3,4,5,6,7,8,9]
]
)
b = a[4:6, 2:9:2]
print(b)

结果:

[[99 99 99 99]
 [99 99 99 99]]

(2). 检索与赋值

行数和列数从0开始
m x n的矩阵行下标0 ~ m-1, 列数从0 ~ n-1
数组[维度1, 维度2, ... 维度n]

把第一行第三列的值赋值为5

[[1 1 1]
 [1 1 1]]
import numpy

x = numpy.array(
    [
        [1, 1, 1],
        [1, 1, 1]
    ]
)
print(x)
x[0, 2] = 5
print(x)

结果:

[[1 1 1]
 [1 1 1]]
[[1 1 5]
 [1 1 1]]

(3). 轴缺失

当提供的索引少于轴(维度)的数量时,缺失的索引被认为是完整的切片

import numpy

a = numpy.fromfunction(lambda x, y: x + y, (2, 2), dtype = int)
print(a)
print(a[0])
print(a[0, :])

结果:

[[0 1]
 [1 2]]
[0 1]
[0 1]

a[0] 相当于 a[, : ]

(4). 轴省略 …

使用 ...省略轴

import numpy

a = numpy.fromfunction(lambda x, y: x + y, (2, 2), dtype = int)
print(a)
print(a[...]) # 相当于 a[ : : ]

print('-----------------')

a = numpy.fromfunction(lambda a, b, c: a + b + c, (4, 4, 4), dtype = numpy.int32)
print(a)
print(a[0, 0, ...]) # 相当于 a[0, 0, :]

结果:

[[0 1]
 [1 2]]
[[0 1]
 [1 2]]
-----------------
[[[0 1 2 3]
  [1 2 3 4]
  [2 3 4 5]
  [3 4 5 6]]
 [[1 2 3 4]
  [2 3 4 5]
  [3 4 5 6]
  [4 5 6 7]]
 [[2 3 4 5]
  [3 4 5 6]
  [4 5 6 7]
  [5 6 7 8]]
 [[3 4 5 6]
  [4 5 6 7]
  [5 6 7 8]
  [6 7 8 9]]]
[0 1 2 3]

如果x数组有5个维度, 则:

x[1,2,…] 相当于 x[1,2,:,:,:]

x[…,3] 相当于 x[:,:,:,:,3]

x[4,…,5,:] 相当于 x[4,:,:,5,:]

3. 数组反转

import numpy

a = numpy.arange(0, 10, 2)
print(a)
a = a[ : :-1]
print(a)

b = numpy.array([
    [1, 2, 3],
    [4, 5, 6]
])
print(b)
b = b[ : :-1, : : -1]
print(b)

结果:

[0 2 4 6 8]
[8 6 4 2 0]
[[1 2 3]
 [4 5 6]]
[[6 5 4]
 [3 2 1]]

[ : : -1] 可以反转某个维度下的元素

4. 布尔索引

import numpy

a = numpy.arange(15).reshape((5, 3))
print(a)
b = numpy.array([True, True, False, False, True])
print(b)
c = a[b, 1:]
print(c)
c[c < 6] = 0
print(c)

结果:

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]
[ True  True False False  True]
[[ 1  2]
 [ 4  5]
 [13 14]]
[[ 0  0]
 [ 0  0]
 [13 14]]

ndarray 遍历

1. 一维数组遍历

跟Python 列表遍历一样

2. 多维数组遍历

(1). 直接使用for-in

直接使用for-in遍历数组第一个维度的元素

import numpy

a = numpy.fromfunction(lambda a, b, c: a + b + c, (3, 3, 3), dtype = numpy.int32)
for i in a:
    print(i)

结果:

[[0 1 2]
 [1 2 3]
 [2 3 4]]
[[1 2 3]
 [2 3 4]
 [3 4 5]]
[[2 3 4]
 [3 4 5]
 [4 5 6]]

因为a是 3 × 3 的立方体

所以是按照立方体的高遍历的

(2). 遍历数组全部元素

如果想要对数组中的每个元素执行操作, 可以使用flat属性, 该属性是数组的所有元素的迭代器

import numpy

a = numpy.fromfunction(lambda a, b, c: a + b + c, (3, 3, 3), dtype = numpy.int32)
for i in a.flat:
    print(i, end = ' ')

结果:

0 1 2 1 2 3 2 3 4 1 2 3 2 3 4 3 4 5 2 3 4 3 4 5 4 5 6 

按照层行列遍历, 第一列结束第二列, 第一行结束第二行, 第一层结束第二层

ndarray 改变形状

常用函数

函数 作用
.reshape(新的维度元组) 返回对原来数组进行形状改变后的数组, 但元素总个数不变, 原数组不改变
.resize(新的维度元组) 对原来数组进行形状改变, 原数组发生改变, 但元素总个数不变

1. reshape() 函数

改变数组的形状

函数 作用
.reshape(新的维度元组) 返回对原来数组进行形状改变后的数组, 但元素总个数不变, 原数组不改变
import numpy

a = numpy.fromfunction(lambda a, b: a + b, (4, 3), dtype = numpy.int32)
print(a)
a = a.reshape(2, 6)
print(a)

结果:

[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 5]]
[[0 1 2 1 2 3]
 [2 3 4 3 4 5]]

如果某个维度被指定为 -1, 则改维度的个数将自动计算

import numpy

a = numpy.fromfunction(lambda a, b: a + b, (4, 3), dtype = numpy.int32)
print(a)
a = a.reshape(-1, 6)
print(a)

结果:

[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 5]]
[[0 1 2 1 2 3]
 [2 3 4 3 4 5]]

注意: 以下情况会报错

  1. 全部维度都为-1
  2. 自动计算出来的值唯分数, 即 (3, 4) -> (5, -1) 会报错

2. resize() 函数

改变数组的形状

函数 作用
.resize(新的维度元组) 对原来数组进行形状改变, 原数组发生改变, 但元素总个数不变
import numpy

a = numpy.fromfunction(lambda a, b: a + b, (4, 3), dtype = numpy.int32)
print(a)
a.resize((6, 2))
print(a)

结果:

[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 5]]
[[0 1]
 [2 1]
 [2 3]
 [2 3]
 [4 3]
 [4 5]]

该情况不允许使用 -1 表示自动计算

ndarray 堆叠

函数

函数 作用
hstack(数组元组) 返回水平方向堆叠的数组
vstack(数组元组) 返回垂直方向堆叠的数组

1. 一维数组列堆叠 column_stack() 函数

函数 作用
一维数组列堆叠(数组元组) 返回列堆叠的数组
import numpy

e = numpy.array([1, 2, 3])
a = numpy.column_stack((e, e))
print(e)
print(a)

结果:

[[1 2 3]
 [1 2 3]]
[[0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]]
[[0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]]

2. 一维数组行堆叠 row_stack() 函数

函数 作用
一维数组列堆叠(数组元组) 返回列堆叠的数组
import numpy

e = numpy.array([1, 2, 3])
a = numpy.row_stack((e, e))
print(e)
print(a)

结果:

[1 2 3]
[[1 2 3]
 [1 2 3]]

3. 水平堆叠 hstack() 函数

函数 作用
hstack(数组元组) 返回水平方向堆叠的数组

对于一维, 两个数组拼接

对于二维, 按照行堆叠, 只要行的个数一致, 就可以堆叠

import numpy

e = numpy.array([1, 2, 3])
a = numpy.zeros((2, 2))
b = numpy.ones((2, 2))
c = numpy.ones((2, 3))
print(numpy.hstack((e, e)))
print(numpy.hstack((a, b)))
print(numpy.hstack((a, c)))

结果:

[1 2 3 1 2 3]
[[0. 0. 1. 1.]
 [0. 0. 1. 1.]]
[[0. 0. 1. 1. 1.]
 [0. 0. 1. 1. 1.]]

4. 垂直堆叠 vstack() 函数

函数 作用
vstack(数组元组) 返回垂直方向堆叠的数组

对于一维, 两个数组长度要一样

对于二维, 按照列堆叠, 只要列的个数一致, 就可以堆叠

import numpy

e = numpy.array([1, 2, 3])
a = numpy.zeros((2, 2))
b = numpy.ones((2, 2))
c = numpy.ones((3, 2))
print(numpy.vstack((e, e)))
print(numpy.vstack((a, b)))
print(numpy.vstack((a, c)))

结果:

[[1 2 3]
 [1 2 3]]
[[0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]]
[[0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]]

ndarray 拷贝

函数

函数 作用
.view() 浅拷贝元素
.copy() 深拷贝元素

1. 深拷贝 copy() 函数

import numpy

a = numpy.arange(6).reshape(2, 3)
c = a.view()
print(a)
print(c)
c[0, 0] = 2
print(a)

结果:

[[0 1 2]
 [3 4 5]]
[[0 1 2]
 [3 4 5]]
[[2 1 2]
 [3 4 5]]

可以看出修改c的值, a的值也改变了

2. 浅拷贝 view() 函数

import numpy

a = numpy.arange(6).reshape(2, 3)
c = a.copy()
print(a)
print(c)
c[0, 0] = 2
print(a)

结果:

[[0 1 2]
 [3 4 5]]
[[0 1 2]
 [3 4 5]]
[[0 1 2]
 [3 4 5]]

可以看出修改c的值, a的值没有改变

ndarray 判断

函数

函数 作用
.all(axis = None) 沿指定的轴判断该轴数组元素是否都不等于0
.any(axis = None) 沿指定的轴判断该轴数组元素是否都不等于0
where(条件, 满足条件操作, 不满足条件操作) 条件赋值

(1). 沿指定的轴判断所有数组元素是否有等于0的

非数字, 正无穷, 负无穷都不等于0

import numpy

a = numpy.arange(6).reshape(2, 3)
print(a)
print(a.all())
print(a.all(axis = 0))
print(a.all(axis = 1))

结果:

[[0 1 2]
 [3 4 5]]
False
[False  True  True]
[False  True]

(2). 沿指定的轴判断该轴数组元素是否都不等于0

非数字, 正无穷, 负无穷都不等于0

import numpy

a = numpy.array([[0, 0, 0], [1, 2, 3]])
print(a)
print(a.any())
print(a.any(axis = 0))
print(a.any(axis = 1))

结果:

[[0 0 0]
 [1 2 3]]
True
[ True  True  True]
[False  True]

(3). 条件赋值 where() 函数

where(条件, 满足条件操作, 不满足条件操作)

import numpy

a = numpy.array([[0, 0, 0], [1, 2, 3]])
print(a)
print(numpy.where(a < 5, a + 3, a))

结果:

[[0 0 0]
 [1 2 3]]
[[3 3 3]
 [4 5 6]]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122784.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!