Python之深入解析Numpy的高级操作和使用

Posted ╰つ栺尖篴夢ゞ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之深入解析Numpy的高级操作和使用相关的知识,希望对你有一定的参考价值。

一、数组上的迭代

  • NumPy 包含一个迭代器对象 numpy.nditer,它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。数组的每个元素可使用 Python 的标准 Iterator 接口来访问,如下所示:
import numpy as np
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print(a)
for x in np.nditer(a):
    print(x)
  • 运行结果:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]
0
5
10
15
20
25
30
35
40
45
50
55
  • 如果两个数组是可广播的,nditer 组合对象能够同时迭代它们,假设数组 a 具有维度 3X4,并且存在维度为 1X4 的另一个数组 b,则使用以下类型的迭代器(数组 b 被广播到 a 的大小):
import numpy as np
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print(a)
b = np.array([1, 2, 3, 4], dtype=int)
print(b)
for x, y in np.nditer([a, b]):
    print(x, y)
  • 运行结果:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]
[1 2 3 4]
0 1
5 2
10 3
15 4
20 1
25 2
30 3
35 4
40 1
45 2
50 3
55 4

二、数组形状修改函数

① ndarray.reshape

  • 函数在不改变数据的条件下修改形状,参数如下:
ndarray.reshape(arr, newshape, order)
  • 如下所示:
import numpy as np
a = np.arange(8)
print(a)
b = a.reshape(4, 2)
print(b)
  • 运行结果:
[0 1 2 3 4 5 6 7]
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

② ndarray.flat

  • 函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器:
import numpy as np
a = np.arange(0, 16, 2).reshape(2, 4)
print(a)
# 返回展开数组中的下标的对应元素
print(list(a.flat))
  • 运行结果:
[[ 0  2  4  6]
 [ 8 10 12 14]]
[0, 2, 4, 6, 8, 10, 12, 14]

③ ndarray.flatten

  • 函数返回折叠为一维的数组副本,函数接受下列参数(其中:order:‘C’ — 按行,‘F’ — 按列,‘A’ — 原顺序,‘k’ —元素在内存中的出现顺序):
ndarray.flatten(order)
  • 如下所示:
import numpy as np
a = np.arange(8).reshape(2, 4)
print(a)
# default is column-major
print(a.flatten())
print(a.flatten(order='F'))
  • 运行结果:
[[0 1 2 3]
 [4 5 6 7]]
[0 1 2 3 4 5 6 7]
[0 4 1 5 2 6 3 7]

三、数组翻转操作函数

① numpy.transpose

  • 函数翻转给定数组的维度,如果可能的话它会返回一个视图。函数接受下列参数:
numpy.transpose(arr, axes)
  • 其中:
    • arr:要转置的数组;
    • axes:整数的列表,对应维度,通常所有维度都会翻转。
  • 示例 1:
import numpy as np
a = np.arange(24).reshape(2, 3, 4)
print(a)
b = np.array(np.transpose(a))
print(b)
print(b.shape)
  • 运行结果:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[[[ 0 12]
  [ 4 16]
  [ 8 20]]

 [[ 1 13]
  [ 5 17]
  [ 9 21]]

 [[ 2 14]
  [ 6 18]
  [10 22]]

 [[ 3 15]
  [ 7 19]
  [11 23]]]
(4, 3, 2)
  • 示例 2:
b = np.array(np.transpose(a, (1, 0, 2)))
print(b)
print(b.shape
  • 运行结果:
[[[ 0  1  2  3]
  [12 13 14 15]]

 [[ 4  5  6  7]
  [16 17 18 19]]

 [[ 8  9 10 11]
  [20 21 22 23]]]
(3, 2, 4)

② numpy.ndarray.T

  • 该函数属于 ndarray 类,行为类似于 numpy.transpose。如下所示:
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
print(a.T)
  • 运行结果:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

③ numpy.swapaxes

  • 函数交换数组的两个轴,这个函数接受下列参数:
numpy.swapaxes(arr, axis1, axis2)
  • 其中:
    • arr:要交换其轴的输入数组;
    • axis1:对应第一个轴的整数;
    • axis2:对应第二个轴的整数。
  • 使用如下:
import numpy as np
a = np.arange(8).reshape(2, 2, 2)
print(a)
print(np.swapaxes(a, 2, 0))
  • 运行结果:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
[[[0 4]
  [2 6]]

 [[1 5]
  [3 7]]]

④ numpy.rollaxis

  • numpy.rollaxis() 函数向后滚动特定的轴,直到一个特定位置,这个函数接受三个参数:
numpy.rollaxis(arr, axis, start)
  • 其中:
    • arr:输入数组;
    • axis:要向后滚动的轴,其它轴的相对位置不会改变;
    • start:默认为零,表示完整的滚动,会滚动到特定位置。
import numpy as np
a = np.arange(8).reshape(2,2,2)
print(a)
print(np.rollaxis(a,2))
print(np.rollaxis(a,2,1))
  • 运行结果:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
[[[0 2]
  [4 6]]

 [[1 3]
  [5 7]]]
[[[0 2]
  [1 3]]

 [[4 6]
  [5 7]]]

四、数组修改维度函数

① numpy.broadcast_to

  • 函数将数组广播到新形状,它在原始数组上返回只读视图,通常不连续。如果新形状不符合 NumPy 的广播规则,该函数可能会抛出ValueError。该函数接受以下参数:
numpy.broadcast_to(array, shape, subok)
  • 使用如下:
import numpy as np
a = np.arange(4).reshape(1,4)
print(a)
print(np.broadcast_to(a,(4,4)))
  • 运行结果:
[[0 1 2 3]]
[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]

② numpy.expand_dims

  • 函数通过在指定位置插入新的轴来扩展数组形状,该函数需要两个参数:
numpy.expand_dims(arr, axis)
  • 其中:
    • arr:输入数组;
    • axis:新轴插入的位置。
  • 使用如下:
import numpy as np
x = np.array(([1, 2], [3, 4]))
print(x)
y = np.expand_dims(x, axis=0)
print(y)
print(x.shape, y.shape)
y = np.expand_dims(x, axis=1)
print(y)
print(x.ndim, y.ndim)
print(x.shape, y.shape)
  • 运行结果:
[[1 2]
 [3 4]]
[[[1 2]
  [3 4]]]
(2, 2) (1, 2, 2)
[[[1 2]]

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

③ numpy.squeeze

  • 函数从给定数组的形状中删除一维条目,此函数需要两个参数:
numpy.squeeze(arr, axis)
  • 其中:
    • arr:输入数组;
    • axis:整数或整数元组,用于选择形状中单一维度条目的子集。
  • 使用如下:
import numpy as np
x = np.arange(9).reshape(1, 3, 3)
print(x)
y = np.squeeze(x)
print(y)
print(x.shape, y.shape)
  • 运行结果:
[[[0 1 2]
  [3 4 5]
  [6 7 8]]]
[[0 1 2]
 [3 4 5]
 [6 7 8]]
(1, 3, 3) (3, 3)

五、数组的连接操作

  • NumPy 中数组的连接函数主要有如下四个:
    • concatenate 沿着现存的轴连接数据序列;
    • stack 沿着新轴连接数组序列;
    • hstack 水平堆叠序列中的数组(列方向);
    • vstack 竖直堆叠序列中的数组(行方向)。

① numpy.stack

  • 函数沿新轴连接数组序列,需要提供以下参数:
numpy.stack(arrays, axis)
  • 其中:
    • arrays:相同形状的数组序列;
    • axis:返回数组中的轴,输入数组沿着它来堆叠。
  • 使用如下:
import numpy as np
a = np.array([[1,2],[3,4]])
print(a)
b = np.array([[5,6],[7,8]])
print(b)
print(np.stack((a,b),0))
print(np.stack((a,b),1))
  • 运行结果:
[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]
[[[1 2]
  [5 6]]

 [[3 4]
  [7 8]]]

② numpy.hstack

  • numpy.hstack 是 numpy.stack() 函数的变体,通过堆叠来生成水平的单个数组:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
b = np.array([[5, 6], [7, 8]])
print(b)
print('水平堆叠:')
c = np.hstack((a, b))
print(c)
  • 运行结果:
[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
水平堆叠:
[[1 2 5 6]
 [3 4 7 8]]

③ numpy.vstack

  • numpy.vstack 是 numpy.stack() 函数的变体,通过堆叠来生成竖直的单个数组:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
b = np.array([[5, 6], [7, 8]])
print(b)
print('竖直堆叠:')
c = np.vstack((a, b))
print(c)
  • 运行结果:
[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
竖直堆叠:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

④ numpy.concatenate

  • 函数用于沿指定轴连接相同形状的两个或多个数组,该函数接受以下参数:
numpy.concatenate((a1, a2,), axis)
  • 其中:
    • a1, a2, …:相同类型的数组序列;
    • axis:沿着它连接数组的轴,默认为 0。
import numpy as np
a = np.array([[1,2],[3Python之深入解析Box为字典添加高级点符号访问特性

SwiftUI之深入解析高级动画的AnimatableModifier使用

SwiftUI之深入解析高级动画的路径Paths

Python网络编程之高级篇二

附录A NumPy高级应用

SwiftUI之深入解析高级动画的几何效果GeometryEffect