Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 移除numpy中的循环以实现简单的矩阵赋值_Python_Numpy_Loops - Fatal编程技术网

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时,使用循环的明显效果变得如此不同,这有点令人沮丧。谢谢