Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 - Fatal编程技术网

Python Numpy中的行交换

Python Numpy中的行交换,python,numpy,Python,Numpy,在Python中,我可以通过多次假装来交换2个变量;它还适用于以下列表: l1,l2=[1,2,3],[4,5,6] l1,l2=l2,l1 打印(l1、l2) >>> [4, 5, 6] [1, 2, 3] 但当我想交换numpy数组的2行时(例如在高斯算法中),它失败了: 将numpy导入为np a3=np.数组([[1,2,3],[4,5,6]) 印刷品(a3) a3[0,:],a3[1,:]=a3[1,:],a3[0,:] 印刷品(a3) >>> [[1 2 3] [4 5 6]] [

在Python中,我可以通过多次假装来交换2个变量;它还适用于以下列表:

l1,l2=[1,2,3],[4,5,6]
l1,l2=l2,l1
打印(l1、l2)
>>> [4, 5, 6] [1, 2, 3]
但当我想交换numpy数组的2行时(例如在高斯算法中),它失败了:

将numpy导入为np
a3=np.数组([[1,2,3],[4,5,6])
印刷品(a3)
a3[0,:],a3[1,:]=a3[1,:],a3[0,:]
印刷品(a3)
>>> [[1 2 3]
[4 5 6]]
[[4 5 6]
[4 5 6]]
我认为,出于一个奇怪的原因,这两列现在指向相同的值;但事实并非如此,因为在前面的行改变a3[0,0]而不是a3[1,0]之后,
a3[0,0]=5


我已经找到了解决这个问题的方法:例如
a3[0,:],a3[1,:]=a3[1,:].copy(),a3[0,:].copy()
。但有人能解释为什么多重矫揉造作的交换在numpy行中失败吗?我的问题涉及Python和Numpy的底层工作。

这是您想要的工作方式:

a3[[0,1]] = a3[[1,0]]

元组赋值中的两个独立赋值互不缓冲;一个接一个地发生,导致覆盖您的观察结果

请查看解释。好的,谢谢,这个问题不是在可能的重复列表中自动提出的。没问题-我知道这个问题的唯一原因是因为我回答了它。+1很好,当您尝试执行
a[[0,1,1]]时,这是一个讨厌的问题+=1
并且位置
1
处的项只增加一次,可以用来交换行;我花了一段时间才明白这背后的逻辑。对新的np.add.at非常满意;事实上,我现在正在用它编写一段代码,这曾经是一个非常慢的python循环。对于sums,
np.bincount
通常比
np.add快得多。在
,我刚刚尝试了50x:
a=np.zeros((1000),dtype=np.intp);b=np.random.ranndint(1000,大小=100000);c=np.random.randint(1000000,大小=100000);[10]中:%timeit np.add.at(a,b,c);100个回路,最佳3个:每个回路19.3毫秒;在[11]中:%timeit a+np.bincount(b,weights=c,minlength=1000);1000个循环,最好是每个循环3:451µs
。当然,可读性受到严重影响,很难想象这种操作会成为瓶颈。但是如果你想要原始的表现,那么这似乎是一条路。这让我非常惊讶。您可能认为np.add.at的实现将是可以想象的最基本的循环。这就是说,它也推广到散射到nd阵列,所以可能会增加一些开销?但我根本无法想象因子40是从哪里来的。