Python 移除numpy中的循环以实现简单的矩阵赋值
如何在这个简单的矩阵赋值中删除循环以提高性能Python 移除numpy中的循环以实现简单的矩阵赋值,python,numpy,loops,Python,Numpy,Loops,如何在这个简单的矩阵赋值中删除循环以提高性能 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++,我发现很难适应NoMPY的功能,像这样做一些非常基本的矩阵操作。我想我已经把它简化成了
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++,我发现很难适应NoMPY的功能,像这样做一些非常基本的矩阵操作。我想我已经把它简化成了一个一维循环,但这对于我所需要的来说仍然太慢了,在我看来,必须有一种更直接的方法来做。有什么建议吗?谢谢
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
如果我理解正确,您正在寻找:
uniq, counter = np.unique(index, return_counts=True, axis=0)
uniq
应该为您提供一组唯一的x,y
s(x,y
将被展平为单个数组)和计数器
数组中相应的重复次数索引
编辑:
根据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
你的循环毫无意义。考虑共享一个例子。@ PS95也许我可以解释一下循环来自哪里。我有一个带有dimensios(时间,x,y)的矩阵温度和一组表示温度范围(0,1,2,3,…nranges)的指数给出的值。我想计算每个x,y(地球位置)给定范围在时间上出现的次数。为此,我使用一个初始化为0的计数器矩阵,其维数为(nranges,x,y),并简单地计算每个范围在温度矩阵中出现的次数。谢谢。我用一个简单的例子来尝试我们的建议谢谢。我用一个简单的例子来比较你的方法。我使用
index=np.zero((2,2,2))
得到counter=[[2.2.]、[2.2.]、[[0.0.]、[0.0.]]
,与预期的初始循环一致。使用你的方法,我得到了uniq=[[0],[0]]
和counter=[[0],[0],[[0],[0]]]
,我真的不知道如何解释它。@sandiamedia我明白了,你仍然可以不使用循环就进行循环,但这是一个非常奇怪的循环。谢谢@ehsanThank you@Ehsan,我只是试了几个例子,它似乎是有效的!!!。我会尽力了解你在做什么。。。。grrrr…当使用numpy时,使用循环的明显效果变得如此不同,这有点令人沮丧。谢谢