我有一个整数矩阵,形状为phase_space
的{{1}},其中每个条目代表空间中该位置的点数。我也有两个形状也为(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.]])
有什么方法可以对此向量化?
答案 0 :(得分:1)
我们可以使用np.bincount
-
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()
。
答案 1 :(得分:0)
您可以使用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.]])