Python 将动力学函数应用于相空间中的每个点(由2D矩阵表示)
我有一个整数矩阵,Python 将动力学函数应用于相空间中的每个点(由2D矩阵表示),python,numpy,vectorization,Python,Numpy,Vectorization,我有一个整数矩阵,phase\u 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
phase\u 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]
有没有办法将其矢量化?我们可以使用-
在更通用的设置上运行示例-
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()
您可以使用pandas.DataFrame.groupby()
在相位空间中累积具有相同坐标的所有移动:
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.]])
工作得很漂亮。谢谢
array([[2., 2., 4.],
[2., 0., 4.],
[0., 4., 0.]])