numpy学习笔记(3),数组连接

6. 连接数组

6.1. 连接数组,

6.2. 分割数组,

6.3. 算术运算,

6.4. 广播(重点)

6.1 连接数组

  • concatenate
  • hstack
  • vstack
6.1.1 使用concatenate函数

沿指定轴连接多个数组,语法格式如下:

numpy.concatenate((a1, a2, ...), axis=0)

  • a1, a2是要连接的数组,除了连接指定轴外,其他轴大小(元素个数)相同。即:按行连接,每一行的元素个数要相同;
  • axis是沿指定轴的索引,默认为0。
python 复制代码
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]]) # 注意:这是个二维数组
ab = np.concatenate((a, b), axis=0)
ab
复制代码
array([[1, 2],
       [3, 4],
       [5, 6]])
python 复制代码
c = b.T
print(c)
# 将b翻转后再与a,沿axis=1连接
ac = np.concatenate((a, c), axis=1)
ac
复制代码
[[5]
 [6]]

array([[1, 2, 5],
       [3, 4, 6]])
6.1.2 使用hstack函数

水平堆叠:相当于concatenate函数的axis=1

python 复制代码
d = np.array([[7], [8]])
ad = np.hstack((a, d)) # 注意hstack的参数是元组类型
6.1.3 使用vstack函数

垂直堆叠:相当于concatenate函数的axis=0

python 复制代码
e = np.array([[11, 23]])
ae = np.vstack((a, e))
ae
复制代码
array([[ 1,  2],
       [ 3,  4],
       [11, 23]])

6.2 分割数组

  • split
  • hsplit
  • vsplit
6.2.1 使用split函数

split函数沿指定轴分割成多个数组,语法格式如下:

python 复制代码
numpy.split(array, indces_or_sections, axis)
  • array:要分割的数组
  • indices_or_sections:整数或数组,如果是整数就用该数平均分割;如果是数组,则沿指定轴切片操作(包含开始元素,不包含结束元素)
  • axis:分割轴

array = [1, 2, 3, 4, 5, 6, 7, 8, 9]

indice_or_sections = 3;

可以分割,因为9可以被3整除;

如果indices_or_sections = 4;

就不能分割,因为9不能被4整除;

python 复制代码
# 整数
a = np.arange(9)
b = np.split(a, 3)
b
复制代码
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
python 复制代码
# 数组
c = np.split(a, [3, 5, 7])
c
复制代码
[array([0, 1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]
python 复制代码
# 二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.split(a, 2, axis=0)
print(b)
复制代码
[array([[1, 2, 3]]), array([[4, 5, 6]])]
python 复制代码
c = np.split(a, 3, axis=1)
print(c)
print(type(c)) # 分割后的c,不是numpy类型了
print(type(c[0]))
复制代码
[array([[1],
       [4]]), array([[2],
       [5]]), array([[3],
       [6]])]
<class 'list'>
<class 'numpy.ndarray'>
6.2.2 使用hsplit与vsplit函数

相当于split函数的axis=1与axis=0的情况

6.3 算术运算

Numpy数组对象可以使用python原生的算术运算符,加,减,乘,除等等

  1. 形状相同的数组计算:每个位置的元素独立计算
  2. 数组+标量:数组里每个元素都与标量单独计算
  3. 形状不同的数组或标量计算:广播
python 复制代码
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
a + b
复制代码
array([[ 6,  8],
       [10, 12]])
python 复制代码
a * b
复制代码
array([[ 5, 12],
       [21, 32]])

注意:a * b并不是矩阵乘法

6.4 广播

不同形状的数组或标量计算时发生广播

6.4.1 标量广播

将标量扩展成与数组形状相同的数组,再进行计算

python 复制代码
a = np.array([[1, 2], [3, 4]])
b = 10
a + b
复制代码
array([[11, 12],
       [13, 14]])
python 复制代码
a * b
复制代码
array([[10, 20],
       [30, 40]])
6.4.2 数组广播

广播规则:

  1. 如果两个数组维度不相等,维度较低的数组的形状会从左侧开始,填充1,知道维度与较高维度的数组相等。
  2. 如果两个数组维度相等,要不对应轴长度相同,要么其中一个长度为1,则是兼容数组,可以广播。长度为1的轴会被扩展。
python 复制代码
a = np.array([36, 42])
b = np.array([[10, 20], [30, 40], [50, 60]])
a + b
复制代码
array([[ 46,  62],
       [ 66,  82],
       [ 86, 102]])

上面代码:

  1. 一维数组a,首先升维成二维数组a2
  2. a2扩展成与b相同形状
python 复制代码
a = np.array([36, 42])
c = np.array([[10, 20, 30], [40, 50, 60]])
a + c
复制代码
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[14], line 3
      1 a = np.array([36, 42])
      2 c = np.array([[10, 20, 30], [40, 50, 60]])
----> 3 a + c


ValueError: operands could not be broadcast together with shapes (2,) (2,3) 

上面代码:

  1. 一维数组a,首先升维成二维数组a2,形状(1, 2)
  2. a2向数组b形状(2, 3)扩展,(2, 2)
  3. 0轴上相等了,但是1轴上不相等,并且a2的1轴不是1,所以不能再扩展
  4. 计算错误

6.5 实例

  1. 将华氏度的值转换成摄氏度
  2. 公式:C = (5(F - 32))/9
python 复制代码
f = [0, 12, 45.21, 34, 99.91]
F = np.array(f)
print("华氏度:", F)
C = (5 * (F - 32))/9
print("摄氏度:", C)
复制代码
华氏度: [ 0.   12.   45.21 34.   99.91]
摄氏度: [-17.77777778 -11.11111111   7.33888889   1.11111111  37.72777778]
相关推荐
云上艺旅5 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
你觉得2055 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
A旧城以西6 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
无所谓จุ๊บ6 小时前
VTK知识学习(50)- 交互与Widget(一)
学习·vtk
FAREWELL000757 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
吴梓穆7 小时前
UE5学习笔记 FPS游戏制作38 继承标准UI
笔记·学习·ue5
Three~stone7 小时前
MySQL学习集--DDL
数据库·sql·学习
齐尹秦8 小时前
HTML 音频(Audio)学习笔记
学习
V---scwantop---信8 小时前
英文字体:大胆都市街头Y2Y涂鸦风格品牌海报专辑封面服装字体 Chrome TM – Graffiti Font
笔记·字体
瞌睡不来8 小时前
(学习总结32)Linux 基础 IO
linux·学习·io