高效构建FEM/FVM矩阵

2023-12-03

这是 FEM/FVM 方程系统的典型用例,因此可能会引起更广泛的兴趣。从三角形网格à la

enter image description here

我想创建一个scipy.sparse.csr_matrix。矩阵行/列表示网格节点处的值。该矩阵在主对角线上以及两个节点通过边连接的地方都有条目。

这是一个 MWE,它首先构建节点->边缘->单元关系,然后构建矩阵:

import numpy
import meshzoo
from scipy import sparse

nx = 1600
ny = 1000
verts, cells = meshzoo.rectangle(0.0, 1.61, 0.0, 1.0, nx, ny)

n = len(verts)

nds = cells.T
nodes_edge_cells = numpy.stack([nds[[1, 2]], nds[[2, 0]],nds[[0, 1]]], axis=1)

# assign values to each edge (per cell)
alpha = numpy.random.rand(3, len(cells))
vals = numpy.array([
    [alpha**2, -alpha],
    [-alpha, alpha**2],
    ])

# Build I, J, V entries for COO matrix
I = []
J = []
V = []
#
V.append(vals[0][0])
V.append(vals[0][1])
V.append(vals[1][0])
V.append(vals[1][1])
#
I.append(nodes_edge_cells[0])
I.append(nodes_edge_cells[0])
I.append(nodes_edge_cells[1])
I.append(nodes_edge_cells[1])
#
J.append(nodes_edge_cells[0])
J.append(nodes_edge_cells[1])
J.append(nodes_edge_cells[0])
J.append(nodes_edge_cells[1])
# Create suitable data for coo_matrix
I = numpy.concatenate(I).flat
J = numpy.concatenate(J).flat
V = numpy.concatenate(V).flat

matrix = sparse.coo_matrix((V, (I, J)), shape=(n, n))
matrix = matrix.tocsr()

With

python -m cProfile -o profile.prof main.py
snakeviz profile.prof

人们可以创建并查看上述内容的配置文件:

enter image description here

方法tocsr()这里占用了运行时的大部分时间,但在构建时也是如此alpha更复杂。因此,我正在寻找加快速度的方法。

我已经发现了什么:

  • 由于数据的结构,矩阵对角线上的值可以预先求和,即

    V.append(vals[0, 0, 0] + vals[1, 1, 2])
    I.append(nodes_edge_cells[0, 0])  # == nodes_edge_cells[1, 2]
    J.append(nodes_edge_cells[0, 0])  # == nodes_edge_cells[1, 2]
    

    这使得I, J, V更短,从而加快速度tocsr.

  • 现在,边缘是“每个单元格”。我可以使用以下命令来识别彼此相等的边缘numpy.unique,有效节省一半左右I, J, V。然而,我发现这也需要一些时间。 (不奇怪。)

我的另一个想法是我可以替换对角线V, I, J通过一个简单的numpy.add.at如果有一个csr_matrix类似于数据结构,其中主对角线单独保存。我知道这存在于其他一些软件包中,但在 scipy 中找不到它。正确的?

也许有一种明智的方法可以直接构建企业社会责任?


我会尝试直接创建 csr 结构,特别是如果您求助于np.unique因为这会给你排序的键,这已经完成了一半的工作。

我假设你现在处于这样的状态i, j按字典顺序排序并重叠v总结使用np.add.at在可选的inverse的输出np.unique.

Then v and j已经是 csr 格式。剩下要做的就是创建indptr你只需简单地度过np.searchsorted(i, np.arange(M+1)) where M是柱长。您可以将这些直接传递给sparse.csr_matrix构造函数。

好吧,让代码说话:

import numpy as np
from scipy import sparse
from timeit import timeit


def tocsr(I, J, E, N):
    n = len(I)
    K = np.empty((n,), dtype=np.int64)
    K.view(np.int32).reshape(n, 2).T[...] = J, I  
    S = np.argsort(K)
    KS = K[S]
    steps = np.flatnonzero(np.r_[1, np.diff(KS)])
    ED = np.add.reduceat(E[S], steps)
    JD, ID = KS[steps].view(np.int32).reshape(-1, 2).T
    ID = np.searchsorted(ID, np.arange(N+1))
    return sparse.csr_matrix((ED, np.array(JD, dtype=int), ID), (N, N))

def viacoo(I, J, E, N):
    return sparse.coo_matrix((E, (I, J)), (N, N)).tocsr()


#testing and timing

# correctness
N = 1000
A = np.random.random((N, N)) < 0.001
I, J = np.where(A)

E = np.random.random((2, len(I)))
D = np.zeros((2,) + A.shape)
D[:, I, J] = E
D2 = tocsr(np.r_[I, I], np.r_[J, J], E.ravel(), N).A

print('correct:', np.allclose(D.sum(axis=0), D2))

# speed
N = 100000
K = 10

I, J = np.random.randint(0, N, (2, K*N))
E = np.random.random((2 * len(I),))
I, J, E = np.r_[I, I, J, J], np.r_[J, J, I, I], np.r_[E, E]

print('N:', N, ' --  nnz (with duplicates):', len(E))
print('direct: ', timeit('f(a,b,c,d)', number=10, globals={'f': tocsr, 'a': I, 'b': J, 'c': E, 'd': N}), 'secs for 10 iterations')
print('via coo:', timeit('f(a,b,c,d)', number=10, globals={'f': viacoo, 'a': I, 'b': J, 'c': E, 'd': N}), 'secs for 10 iterations')

Prints:

correct: True
N: 100000  --  nnz (with duplicates): 4000000
direct:  7.702431229001377 secs for 10 iterations
via coo: 41.813509466010146 secs for 10 iterations

加速比:5 倍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效构建FEM/FVM矩阵 的相关文章

  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • 使用 Python 和 lmfit 拟合复杂模型?

    我想适合椭偏仪 http en wikipedia org wiki Ellipsometry使用 LMFit 将数据转换为复杂模型 两个测量参数 psi and delta 是复杂函数中的变量rho 我可以尝试将问题分离为实部和虚部共享参
  • Python3将模块从文件夹导入到另一个文件夹

    我的结构字典是 mainFolder folder1 init py file1 py file2 py folder2 init py file3 py file4 py setup py init py 我需要将 file4 py 从f
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 使用 Tkinter 打开网页

    因此 我的应用程序需要能够打开其中的单个网页 并且它必须来自互联网并且未保存 特别是我想使用 Tkinter GUI 工具包 因为它是我最熟悉的工具包 最重要的是 我希望能够在窗口中生成事件 例如单击鼠标 但无需实际使用鼠标 有什么好的方法
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • Python 在哪些系统上不使用 IEEE-754 双精度浮点数

    Python 对 IEEE 754 浮点运算进行了各种引用 但不保证1 https docs python org 3 tutorial floatingpoint html 2 https pythondev readthedocs io
  • Python脚本从字母和两个字母组合生成单词

    我正在编写一个简短的脚本 它允许我使用我设置的参数生成所有可能的字母组合 例如 b a 参数 单词 5 个字母 第三 第五个字母 b a 第一个字母 ph sd nn mm 或 gh 第二 第四个字母 任意元音 aeiouy 和 rc 换句
  • 如何将 URL 添加到 Telegram Bot 的 InlineKeyboardButton

    我想制作一个按钮 可以从 Telegram 聊天中在浏览器中打开 URL 外部超链接 目前 我只开发了可点击的操作按钮 update message reply text Subscribe to us on Facebook and Te
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

    我正在尝试上传一个 csv使用 python 将文件写入 Microsoft Azure 存储帐户 我已经发现C sharp https blogs msdn microsoft com jmstall 2012 08 03 convert

随机推荐

  • Ember-Data:访问旁加载资源列表?

    我有一些 JSON 具有这种结构 documents路径 ID 是 UUID tags id a33fc396 2428 11e3 8eeb 0800270f33f4 name test
  • 如何在 Pandas 中使用 allocate() 方法创建包含空格的列

    样本数据 import pandas as pd df1 pd DataFrame Original City Daimler Chicago Mitsubishi LA Tesla Vienna Toyota Zurich Renault
  • Javascript 中的即时搜索功能

    我正在使用以下 JavaScript 来实现即时搜索功能 以检测访问者何时停止书写 因此该功能不会在每次按键时运行 它可以工作 但延迟超过 1000 毫秒 即使我将其设置为 200 毫秒 即时搜索功能运行之前也会有 1 2 秒的延迟 是否有
  • 如何使用 .pfx 文件签署 Java 小程序?

    我试图使用本指南使用我们公司的 pfx 证书签署 jar 小程序存档 以及来自互联网的其他一些内容 http www globalsign com support ordering guides SignJavaCodeAppletsPFX
  • 从字符串中去除中文字符(vba)

    我正在使用 Microsoft Project VBA 将我的活动名称从英文翻译成中文 我的问题是我在一些英文活动名称中嵌入了一些中文翻译 我想在将字符串传递给 Microsoft Translator 之前去掉中文字符 关于我如何做到这一
  • Android ListView ArrayList 上的空指针异常

    我有一个显示数组列表内容的列表视图 我正在使用一个简单的适配器来实现这一点 就像这样 public static ArrayList
  • Docker 使用 Java 实现两个容器之间的通信

    有两个java文件 Server java和Client java 两者都在单独的容器中 码头工人文件 我用于服务器的 dockerfile 在名为 服务器 的文件夹中 是 FROM java 8 COPY Server java RUN
  • 会话过期后从数据库中删除它吗?

    这可能是一个愚蠢的问题 但我想知道每 15 分钟从数据库中删除所有过期的 会话 是否是一个好主意 或者只是把它留在那里 会话在 X 分钟后过期 不再有用 似乎只是占用空间 当我的团队在 NET 应用程序中部署 SQL Server 会话状态
  • 使用 NSGlyph 和内存分配

    在跟踪换行符的方法中频繁地 for a NSTextView visibleRect 我正在分配内存NSGlyph to use NS布局管理器 getGlyphs range 我应该 可以找出这应该有多少内存 因为我有范围的参考 不影响布
  • FindAll 包含涉及复杂的多对多关系 (sequelizejs)

    这有软件工程 SE 中的一个兄弟问题 考虑Company Product and Person 之间存在多对多的关系Company and Product 通过联结表Company Product 因为给定的公司可能生产不止一种产品 例如
  • init_fs_encoding:无法获取文件系统编码的Python编解码器

    我正在 apache 上运行 Django 网站 这是我的尾巴httpd conf file ServerName 127 0 0 1 8080 Django Project LoadFile c python39 python39 dll
  • 在 Linux 上使用可滚动 x(时间/水平)轴绘制数据

    我想绘制 x 轴较长的数据 如果我绘制整个 x 轴 那么绘图就会缩小并且几乎无法读取 我发现了this回答 SO 指向下列的scipy matplotlib 代码 但是当我尝试运行上述代码时 出现以下错误 Traceback most re
  • Java-不透明颜色

    我正在尝试画一些线 问题在于颜色 例如 我有几条红色线 然后我画了一条蓝色线 或相反 有时 对于最后一个来说 那条线更多 是不透明的 我尝试制作新颜色并使用 alpha 复合 0 7 设置颜色 对于更多线条 我保留默认的一种颜色 不透明 a
  • 如何使用 iOS 获取 UIKeyboard 大小

    有没有办法以编程方式获取 UIKeyboard 大小 横向高度为 216 0f 高度为 162 0f 以下似乎已被弃用 有没有某种方法可以在 3 0 iPhone OS SDK 和 4 0 iPhone OS SDK 中没有任何警告的情况下
  • 在Python中动态定义/更新ctypes结构

    我已经在 ctypes 中创建了子结构和结构 如下所示 我在结构内部定义了具有某种预定义大小的子结构数组 根据要求SIZE可以设置为0最初 可能会根据用户输入而变化 from ctypes import class MySubStructu
  • 使用回调将 C 库 (GSL) 包装在 cython 代码中

    我是新手cython and c 我想使用 cython 来加快代码的性能 我想用gsl integration我的代码中的库用于集成 更新 test gsl pyx cdef extern from math h double log d
  • 如何在Android中每分钟获取gps坐标?

    我想每分钟获取我的坐标 即使用户没有移动 所以我使用 requestLocationUpdates 和以下参数 locMgr requestLocationUpdates LocationManager GPS PROVIDER 60000
  • NSMutableArray 内的块泄漏 (ARC)

    我有一些在块内的操作 此操作 仅更新一个UIImage像这样 UIImage image self myImage image 我的图像是通过访问互联网来计算的NSURLConnection 当我从互联网上收到图像时 我称该块为NSMuta
  • 如何优化在 postgresql 中查询这些数据?

    我的查询对于特定行来说速度很慢 Postgres 选择做一个Seq Scan而不是使用Index Scan对于某些行 我认为是因为它实际上比使用索引更快 以下是针对正常工作负载使用索引的查询计划 http explain depesz co
  • 高效构建FEM/FVM矩阵

    这是 FEM FVM 方程系统的典型用例 因此可能会引起更广泛的兴趣 从三角形网格 la 我想创建一个scipy sparse csr matrix 矩阵行 列表示网格节点处的值 该矩阵在主对角线上以及两个节点通过边连接的地方都有条目 这是