繁体   English   中英

使用 python/numpy 创建复杂矩阵

[英]Using python/numpy to create a complex matrix

使用 python/numpy,我想创建一个 2D 矩阵 M,其组件是:

在此处输入图片说明

我知道我可以用一堆 for 循环来做到这一点,但是有没有更好的方法来使用 numpy(不使用 for 循环)来做到这一点?


这就是我尝试的方式,最终给了我一个值错误。

我尝试首先定义一个对 k 求和的函数:

define sum_function(i,j):
    initial_array = np.arange(g(i,j),h(i,j)+1)
    applied_array = f(i,j,initial_array)
    return applied_array.sum()

然后我尝试使用 np.mgrid 创建 M 矩阵,如下所示:

ii, jj = np.mgrid(start:fin, start:fin)
M_matrix = sum_function(ii,jj)

——

(已编辑)让我写下矩阵的具体形式作为例子: M_{i,j} = \\sum_{k=min(i,j)}^{i+j}\\sin{\\left( (i +j)^k \\right)}

如果 i,j = 0,1,那么这个矩阵是 2 × 2,它的形式将是 \\bigl(\\begin{smallmatrix} \\sin(0) & \\sin(1) \\ \\sin(1)& \\sin( 2)+\\sin(4) \\end{smallmatrix}\\bigr)

现在,如果矩阵变得非常大,我将如何在不使用 for 循环的情况下创建这个矩阵?

为了简化思考,让我们将i,j维度分解为 1, ij维度。 我们可以评估 3 个数组吗:

G = g(ij)   # for all ij values
H = h(ij)
F = f(ij, kk)  # for all ij, and all kk

换句话说, g,h,f可以在多个值处进行评估,以生成整个数组?

如果所有ij或子集(最好是切片)的GH值相同,则

F[:, G:H].sum(axis=1)

将是所有ij的值。

如果每个切片的大小HG差异相同,那么我们可以构造一个二维索引数组GH使得

F[:, GH].sum(axis=1)

换句话说,我们正在对F行的恒定大小窗口求和。

但是,如果ij之间的HG差异有所不同,我认为我们只能分别对每个ij元素进行求和 - 使用 Python 级别循环,或者符合numbacython

我想我自己找到了这个问题的答案。 我首先创建 3D 数组 F_{i,j,k} = f(i,j,k)。 然后创建一个 mask_array,如果 g(i,j) < k < f(i,j),则其分量为 Ture,否则为 False。 然后我计算这两个数组的逐元素乘法,F*mask_array,然后在 k 轴上求和。 例如,可以通过以下代码有效地创建此矩阵。

M_{i,j} = \\sum_{k=min(i,j)}^{i+j}\\sin{\\left( (i+j)^k \\right)}

#in this example, g(i,j) = min(i,j) and h(i,j) = i+j f(i,j,k) = sin((i+j)^k)
# 0<= i, j <= 2

#kk should range from min g(i,j) to max h(i,j)
ii, jj, kk = np.mgrid[0:3,0:3,0:5]

# k > g(i,j)
frm1 = kk >= jj
frm2 = kk >= ii
frm = np.logical_or(frm1,frm2)

# k < h(i,j)
to = kk <= ii+jj

#mask
k_mask = np.logical_and(frm,to)

def f(i,j,k):
    return np.sin((i+j)**k)

M_before_mask = f(ii,jj,kk)

#Matrix created
M_matrix = (M_before_mask*k_mask).sum(axis=2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM