python - 将动态函数应用于相空间中的每个点(由二维矩阵表示)

标签 python numpy vectorization

我有一个整数矩阵,形状为 (n,n)phase_space,其中每个条目代表空间中该位置的点数。我还有两个更新矩阵 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] 

有什么方法可以对其进行矢量化吗?

最佳答案

我们可以使用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()

关于python - 将动态函数应用于相空间中的每个点(由二维矩阵表示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732217/

相关文章:

python - 导入作为符号链接(symbolic link)的文件

python - Numpy:比较两个数据集的适应性

python - 用于多个维度的 numpy linspace 和网格

r - 在 R 中使用 which() 函数时进行矢量化

python - 将 python 代码向量化为 numpy

matlab - 如何在 MATLAB 中向量化交集核函数?

python - 如何迭代地为不同的变量赋值

python - 如何将 series.isin 与不同的集合一起用于不同的值?

python - 训练和预测后恢复实例的 ID

python - 如何编写一个可调用 View 以在 Pyramid 中显示静态 html 文件?