【问题标题】:Removing loops in numpy for a simple matrix assignment删除 numpy 中的循环以进行简单的矩阵分配
【发布时间】:2020-06-29 00:37:15
【问题描述】:

如何在这个简单的矩阵赋值中移除循环以提高性能?

nk,ncol,nrow=index.shape
for kk in range(0,nk):
   for ii in range(0,nrow):
       for jj in range(0,ncol):
           idx=index[kk][ii][jj]
           counter[idx][ii][jj]+=1

我来自 C++,我发现很难适应 numpy 的函数来执行一些非常基本的矩阵操作,比如这个。我想我已经将它简化为一个一维循环,但这对于我需要的东西来说仍然太慢了,在我看来,必须有一种更直接的方法来做到这一点。有什么建议么?谢谢

for kk in range(0,nk):
    xx,yy = np.meshgrid(np.arange(ncol),np.arange(nrow))
    counter[index[kk,:,:].flatten(),yy.flatten(),xx.flatten()]+=1    

【问题讨论】:

  • 你的循环没有意义。考虑分享一个例子。
  • @ps95 如果我解释一下循环来自哪里?我有一个带有维度(时间,x,y)的矩阵温度和由一组代表温度范围(0,1,2,3,..nranges)的索引给出的值。我想为每个 x,y(地球位置)计算给定范围及时出现的次数。为此,我使用一个初始化为 0 且维度为 (nranges, x,y) 的计数器矩阵,并简单地计算每个范围在温度矩阵中出现的次数。

标签: python numpy loops


【解决方案1】:

如果我理解正确,您正在寻找这个:

uniq, counter = np.unique(index, return_counts=True, axis=0)

uniq 应该为您提供一组唯一的 x,ys(x,y 将被展平为单个数组)和 counter 数组中对应的重复次数 index

编辑

根据 OP 的评论如下:

xx,yy = np.meshgrid(np.arange(ncol),np.arange(nrow))
idx, counts = np.unique(np.vstack((index.flatten(),np.repeat(yy.flatten(),nk),np.repeat(xx.flatten(),nk))), return_counts=True,axis=1)
counter[tuple(idx)] = counts

【讨论】:

  • 谢谢。我正在用一个简单的例子来尝试我们的建议
  • 谢谢。我正在使用一个简单的示例来比较您的方法。我使用index=np.zeros((2,2,2)) 并得到counter=[[[2. 2.], [2. 2.]],[[0. 0.],[0. 0.]]] 与预期的初始循环。使用你的方法我得到uniq=[[[0 0], [0 0]]counter= [[0 0],[0 0]]],[[[0 0],[0 0]]],我真的不知道如何解释。
  • @SandiaDeDia 我明白了,你仍然可以在没有循环的情况下执行该循环,但这是一个非常奇怪的循环。
  • 谢谢@Ehsan,我刚刚尝试了几个例子,它似乎正在工作!!!。我会试着理解你在做什么.... grrrr .... 使用循环这样一个明显的事情在使用 numpy 时变得如此不同,这有点令人沮丧。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多