返回介绍

广播

发布于 2025-01-01 12:38:40 字数 4620 浏览 0 评论 0 收藏 0

术语广播描述了在算术运算期间,如何处理不同形状的数组。 Numpy 首先使用广播一词,但现在用于其他库,如 Tensorflow 和 Matlab;规则因库而异。

来自 Numpy 文档:

广播提供了一种向量化数组操作的方法,使循环在 C 而不是 Python 中出现。 它可以不制作不必要的数据副本而实现,并且通常可以产生高效实现。最简单的广播示例在数组乘以标量时发生。

a = np.array([1.0, 2.0, 3.0])
b = 2.0
a * b

# array([ 2.,  4.,  6.])

v=np.array([1,2,3])
print(v, v.shape)

# [1 2 3] (3,)

m=np.array([v,v*2,v*3]); m, m.shape

'''
(array([[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]]), (3, 3))
'''

n = np.array([m*1, m*5])

n

'''
array([[[ 1,  2,  3],
        [ 2,  4,  6],
        [ 3,  6,  9]],

       [[ 5, 10, 15],
        [10, 20, 30],
        [15, 30, 45]]])
'''

n.shape, m.shape

# ((2, 3, 3), (3, 3))

我们可以使用广播来将矩阵和数组相加:

m+v

'''
array([[ 2,  4,  6],
       [ 3,  6,  9],
       [ 4,  8, 12]])
'''

注意如果我们转置数组会发生什么:

v1=np.expand_dims(v,-1); v1, v1.shape

'''
(array([[1],
        [2],
        [3]]), (3, 1))
'''

m+v1

'''
array([[ 2,  3,  4],
       [ 4,  6,  8],
       [ 6,  9, 12]])
'''

通用的 NumPy 广播规则

操作两个数组时,NumPy 会逐元素地比较它们的形状。 它从最后的维度开始,并向前移动。 如果满足:

  • 他们是相等的,或者
  • 其中一个是 1

两个维度兼容。

数组不需要具有相同数量的维度。 例如,如果你有一个 256×256×3 的 RGB 值数组,并且你希望将图像中的每种颜色缩放不同的值,则可以将图像乘以具有 3 个值的一维数组。 根据广播规则排列这些数组的尾部轴的大小,表明它们是兼容的:

Image  (3d array): 256 x 256 x 3
Scale  (1d array):             3
Result (3d array): 256 x 256 x 3

回顾

v = np.array([1,2,3,4])
m = np.array([v,v*2,v*3])
A = np.array([5*m, -1*m])

v.shape, m.shape, A.shape

# ((4,), (3, 4), (2, 3, 4))

下列操作有效嘛?

A

A + v

A.T + v

A.T.shape

(SciPy 中的)稀疏矩阵

具有大量零的矩阵称为稀疏(稀疏是密集的反义)。 对于稀疏矩阵,仅仅存储非零值,可以节省大量内存。

另一个大型稀疏矩阵的例子:

来源

这是最常见的稀疏存储格式:

  • 逐坐标(scipy 称 COO)
  • 压缩稀疏行(CSR)
  • 压缩稀疏列(CSC)

让我们来看看 这些例子

实际上还有 更多格式

如果非零元素的数量与行(或列)的数量成比例而不是与行列的乘积成比例,则通常将一类矩阵(例如,对角)称为稀疏。

Scipy 实现

来自 Scipy 稀疏矩阵文档

  • 为了有效地构造矩阵,请使用 dok_matrixlil_matrixlil_matrix 类支持基本切片和花式索引,其语法与 NumPy 数组类似。 如下所示,COO 格式也可用于有效地构造矩阵
  • 要执行乘法或求逆等操作,首先要将矩阵转换为 CSC 或 CSR 格式。
  • CSR,CSC 和 COO 格式之间的所有转换都是高效的线性时间操作。

今天:CT 扫描

引言

数学真的可以拯救你的生命吗?当然可以!! ” (可爱的文章)

(CAT 和 CT 扫描指代相同的过程。CT 扫描是更现代的术语)

本课程基于 Scikit-Learn 示例 压缩感知:使用 L1 先验的层析成像重建(Lasso)

我们今天的目标

读取 CT 扫描的结果并构建原始图像。

对于(特定位置和特定角度的)每个 X 射线,我们进行单次测量。 我们需要从这些测量中构建原始图像。 此外,我们不希望患者经历大量辐射,因此我们收集的数据少于图片区域。

我们会看到:

来源: 压缩感知

来源

导入

%matplotlib inline
import numpy as np, matplotlib.pyplot as plt, math
from scipy import ndimage, sparse

np.set_printoptions(suppress=True)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文