使用 python/numpy 创建复数矩阵
Using python/numpy to create a complex matrix
使用 python/numpy,我想创建一个二维矩阵 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)}
%7D%5E%7Bi+j%7D%5Csin%7B%5Cleft(&space;(i+j)%5Ek&space;%5Cright)%7D)
如果 i,j = 0,1,则此矩阵为 2 x 2,其形式为
\bigl(\begin{smallmatrix}
\sin(0) & \sin(1) \
\sin(1)& \sin(2)+\sin(4)
\end{smallmatrix}\bigr)
&space;&&space;%5Csin(1)&space;%5C%5C&space;%5Csin(1)&&space;%5Csin(2)+%5Csin(4)&space;%5Cend%7Bsmallmatrix%7D%5Cbigr))
现在如果矩阵变得非常大,我如何在不使用 for 循环的情况下创建这个矩阵?
为了简化思路,让我们将 i,j
维度分解为一个 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
或子集(最好是切片)的 G
和 H
值相同,则
F[:, G:H].sum(axis=1)
将是所有 ij
.
的值
如果 H-G
差异,即每个切片的大小相同,那么我们可以构造一个二维索引数组,GH
这样
F[:, GH].sum(axis=1)
换句话说,我们对 F
行的常数大小 windows 求和。
但是,如果 H-G
差异在 ij
之间有所不同,我认为我们将坚持对每个 ij
元素分别进行求和 - 使用 Python 级循环,或符合 numba
或 cython
.
的
我想我自己找到了答案。我首先创建 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)
使用 python/numpy,我想创建一个二维矩阵 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 x 2,其形式为 \bigl(\begin{smallmatrix} \sin(0) & \sin(1) \ \sin(1)& \sin(2)+\sin(4) \end{smallmatrix}\bigr)
现在如果矩阵变得非常大,我如何在不使用 for 循环的情况下创建这个矩阵?
为了简化思路,让我们将 i,j
维度分解为一个 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
或子集(最好是切片)的 G
和 H
值相同,则
F[:, G:H].sum(axis=1)
将是所有 ij
.
如果 H-G
差异,即每个切片的大小相同,那么我们可以构造一个二维索引数组,GH
这样
F[:, GH].sum(axis=1)
换句话说,我们对 F
行的常数大小 windows 求和。
但是,如果 H-G
差异在 ij
之间有所不同,我认为我们将坚持对每个 ij
元素分别进行求和 - 使用 Python 级循环,或符合 numba
或 cython
.
我想我自己找到了答案。我首先创建 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)