numpy多维数组分配未知逻辑错误

时间:2019-05-08 17:10:41

标签: python numpy

我对为什么在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]]]

为什么?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

当您希望代码将变量的值分配给新对象时,对代码的解释会不同:

引用python standard library

  

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()