将动态函数应用于相空间中的每个点(由2D矩阵表示)

2024-04-30 06:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个整数矩阵,phase_space的形状(n,n),其中每个条目表示空间中该位置的点数。我还有两个更新矩阵u_x, u_y,形状也是(n,n),整数在0,...,n范围内,指定我的动力系统在空间中取每个对应点的位置。 我想“应用”更新矩阵的相空间迭代。你知道吗

例如,如果

>>>u_x
array([[1, 2, 1],
       [0, 1, 2],
       [0, 0, 0]])
>>>u_y
array([[2, 1, 2],
       [1, 0, 1],
       [2, 2, 0]])
>>>phase_space 
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

我想要

>>>new_phase_space
array([[1., 1., 2.],
       [1., 0., 2.],
       [0., 2., 0.]])

我目前的解决方案是如下循环

for i in range(n):
    for j in range(n):
        new_phase_space[u_x[i, j], u_y[i, j]] += phase_space[i,j] 

有什么方法可以把它矢量化吗?你知道吗


Tags: innewfor空间条目range矩阵space
2条回答

您可以使用pandas.DataFrame.groupby()累积phase_space中具有相同坐标的所有移动:

new_phase_space + (pd.DataFrame(phase_space)
           .stack()
           .groupby([u_x.ravel(), u_y.ravel()])
           .sum()
           .unstack(fill_value=0)
           .values
)

输出:

array([[2., 2., 4.],
       [2., 0., 4.],
       [0., 4., 0.]])

我们可以用^{}-

M,N = u_x.max()+1,u_y.max()+1
ids = u_x*N+u_y
out = np.bincount(ids.ravel(),phase_space.ravel(),minlength=M*N).reshape(M,N)

在更通用的设置上运行示例-

In [14]: u_x
Out[14]: 
array([[1, 2, 1],
       [0, 1, 4],
       [0, 0, 0]])

In [15]: u_y
Out[15]: 
array([[2, 1, 2],
       [6, 0, 1],
       [2, 6, 0]])

In [17]: phase_space
Out[17]: 
array([[1, 1, 1],
       [5, 1, 1],
       [1, 1, 1]])

In [18]: out
Out[18]: 
array([[1., 0., 1., 0., 0., 0., 6.],
       [1., 0., 2., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.]])

我们还可以利用稀疏矩阵,特别是在考虑记忆的情况下-

from scipy.sparse import csr_matrix,coo_matrix

out = coo_matrix( (phase_space.ravel(), (u_x.ravel(), u_y.ravel())), shape = (M,N))

输出将是一个稀疏矩阵。要转换为密集型,请使用out.toarray()。你知道吗

相关问题 更多 >