首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算按列的主要顺序存储的函数

计算按列的主要顺序存储的函数
EN

Stack Overflow用户
提问于 2020-10-01 05:53:20
回答 1查看 65关注 0票数 2

我试图在离散点计算一个函数并按列的主要顺序存储,如下所示:

代码语言:javascript
复制
import numpy as np; 

N = 3 ##
n = N * N
h = 1 / (N + 1) # step size
h2 = h**2  # 


deltaX = np.zeros(N)
deltaY = np.zeros(N);

def Function(x, y):
    output = -20. * np.pi * np.sin(2 * np.pi * x) * sin(4 * np.pi * y)
    return output
    
## Equally spaced delta: 
for i in range(1, N + 1): 
    deltaX[i - 1] = i * h; 
    deltaY[i - 1] = i * h; 

### Lexicographic Row order  ###

### Evaluation of function at deltaX and deltaY 

feval = np.zeros((n, 1))

如何评价这个函数的离散化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 06:28:53

好消息:您的函数正确地使用了numpy操作,因此是完全向量化的。这意味着您可以在输入数组的每个元素上计算它。

输入的形状不必完全匹配。他们只需要广播在一起。这意味着只有非单例维度需要匹配。

因此,从创建适当的输入数组开始。Numpy提供了在不循环的情况下优雅地完成此操作的工具:

代码语言:javascript
复制
N = 3
h = 1 / (N + 1)

delta_x = np.arange(1., N + 1.) * h
delta_y = np.linspace(h, N * h, N)[:, None]

我故意使用两种不同的方法来创建坐标数组,作为一个例子。在实践中,您可能希望使用这两种方法之一。

索引[:, None]delta_y转换为列向量。None引入了一种新的单轴。有很多其他方法来做同样的事情,比如`delta_y = ....reshape(-1,1)。并读取我链接到的文档,以及我使用的所有函数。

现在有了y方向的列和x中的行,您可以将Function调用为

代码语言:javascript
复制
val = Function(delta_x, delta_y)

将二维矩阵val排列成一维阵列的操作称为raveling。默认情况下,它使用numpy在内存中使用的默认行主顺序。这个顺序也被称为"C“命令。另一种安排是按照列的主要顺序来解释数组,就像Matlab所做的那样。这叫Fortran命令。它需要数据的副本,因为这不是元素在内存中的布局方式。

按Fortran顺序到ravel的一条路:

代码语言:javascript
复制
feval = val.ravel(order='F')

另一种选择是转置和使用C顺序:

代码语言:javascript
复制
feval = val.T.ravel()

最后两行可以组合在一起,所以最后有3行:

代码语言:javascript
复制
delta_x = h * np.arange(1., N + 1.)
delta_y = h * np.arange(1., N + 1.)[:, None]
feval = Function(delta_x, delta_y).ravel(order='F')

你可以把它做成一个单线,但这是在推动它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64149786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档