我对为什么在numpy数组上实现的这种气泡排序将 all 项设置为其中一项感到困惑(我不知道哪一个数组太大)
数据类型为
...
[[1128 1026 1192 1023]]
[[ 771 195 858 196]]
[[ 953 1799 955 1738]]]
当我有一个int数组时,相同的算法可以对它进行完美排序,
g = [i for i in range(10)]
for i in range(0,len(g)):
for j in range(0,len(g)):
if(g[i]>g[j]):
cnt = g[i]
g[i] = g[j]
g[j] = cnt
我想我的问题是我不了解多维numpy数组元素分配,请解释为什么会这样:
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
min_line_length, max_line_gap)
for i in range(0,len(lines)):
for j in range(0,len(lines)):
if(lines[i][0][1]<lines[j][0][1]):
cnt = lines[i][0]
lines[i][0] = lines[j][0]
lines[j][0] = cnt[/CODE]
[[[ 738 1831 867 1831]]
...
[[ 738 1831 867 1831]]
[[ 738 1831 867 1831]]
[[ 738 1831 867 1831]]]
为什么?任何帮助表示赞赏。
答案 0 :(得分:1)
当您希望代码将变量的值分配给新对象时,对代码的解释会不同:
Python中的赋值语句不复制对象,它们创建 目标和对象之间的绑定。对于是 易变或包含易变项目,因此有时需要一份副本 可以更改一个副本而无需更改其他副本。该模块提供 通用的浅层和深层复制操作(如下所述)。
我举一个带有列表的例子:
a
初始化为具有一个值为9的元素的列表:
In [1]: a = [9]
现在
In [2]: b = a
虽然看起来您刚刚创建的对象具有与a
相同的值,但实际上这行代码所做的是创建对same
对象的引用。
因此,为a
的第一个元素分配新值将更改基础对象:
In [3]: a[0] = 1
如果调用了您为该对象提供的新名称,它将仍然引用该对象:
In [4]: b
Out[4]: [1]
为避免不必要的行为,应使用copy
:
In [1]: import copy
In [2]: a = [9]
In [3]: b = copy.copy(a)
In [4]: a[0] = 1
In [5]: b
Out[5]: [9]
np.arrays
有一个.copy()方法,您可以这样调用,而无需导入副本:
a = np.array([1,2,3])
b = a.copy()