numpy中的数据在python中的传递方案 |
您所在的位置:网站首页 › python中属于可变类型 › numpy中的数据在python中的传递方案 |
np.array数据在python中属于可变数据类型。所以它事实上遵循以下规则: 属于可变类型,添加或者修改数据时,变量对应的内存地址不会改变。 可变类型的修改一直在引用原来的内存地址。 注意,如果是重新赋值,内存地址就会发生改变。 也就是说 array型数据如果不进行重新赋值就一直属于地址传递。 结果如下: import numpy as np x=np.zeros([3,3]) b=x print(id(b)) #2508720157360 print(id(x)) #2508720157360 #b=x 采用地址传递,二者地址完全相同 x=np.ones([3,3]) #重新赋值 地址不再相同 print(id(x)) #2508720157440然而,当我们不重新赋值,而是逐个更改所有元素时 import numpy as np x=np.zeros([3,3]) b=x print(id(b)) #2508720159360 print(id(x)) #2508720159360 #地址传递 x[:,:]=np.ones([3,3]) print(id(x)) #2508720159360 #没有重新赋值,只是对内容进行更改,所以地址没有改变可以看到,逐个更改所有元素就不会改变地址。 博主分享这一内容是因为在做聚类算法时,由于需要计算聚类中心在相邻两代中改变的幅度作为算法的终止条件。代码如下: for ti in range(time): #迭代 center=x.center #上一代聚类中心 x.mark() #重新标号 x.exchange_center(k) #更新聚类中心 #print(center) if np.mean(x.center-center)1: break在上面的部分中,由于对上一代的聚类中心进行更新时,直接进行了赋值。系统自动进行了地址传递,直接导致了center在后续x.center更新时也进行了更新,给博主的debug部分造成了不小的麻烦。更改时,只需要将该行修改为 center=x.center.copy() 或者在更新聚类中心时对中心进行重新赋值即可。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |