【问题标题】:some bug which i can not find for two days (output is not as expected)一些我两天都找不到的错误(输出不符合预期)
【发布时间】:2014-06-13 13:17:14
【问题描述】:
from numpy import *
import time
import pylab as plt

a=zeros([10,10])
b=ones([10,10])
dx=dy=0.1
x,y = mgrid[:1:dx,:1:dy]
def add(a,b):
  a[1:-1,1:-1]=a[1:-1,1:-1]+b[1:-1,1:-1]

  data=0
  print(data)
for i in range(4):
#data.append(a)
    print (a)
    add(a,b)

上面是说明我遇到的问题的说明代码。 我的代码打印的是:

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  1.  1.  1.  1.  1.  1.  1.  1.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  2.  2.  2.  2.  2.  2.  2.  2.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  3.  3.  3.  3.  3.  3.  3.  3.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

但是代码输出:

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  4.  4.  4.  4.  4.  4.  4.  4.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

那么这种问题有解决办法吗?

谢谢~

有人提供了以下解决方案:

from numpy import*
import time
import pylab as plt

dx=dy=0.1
x,y = mgrid[:1:dx,:1:dy]

data=[]
for i in range(4):
    a=zeros([10,10])
    b=ones([10,10])
    a[1:-1,1:-1] = b[1:-1,1:-1]*i
    data.append(a)

for k in range(4):
     print(data[k])

但是,这不是解决此类问题的典型方法。那是因为如果我使用的[add]函数或者示例中的a,b数组发生变化,这个解决方案将失去效果

【问题讨论】:

  • 不清楚你在问什么。我没有得到您替换 [[0. 4. 4. .....]] 使用任一代码 sn-p.您的代码的期望输出是什么?
  • 您的第一个代码在我的系统上完全符合您的预期。您确定您正在运行您发布的相同代码吗?
  • 谢谢各位,问题已经解决了。下面的答案是一个很好的解决方案。 :)

标签: python numpy storage multidimensional-array


【解决方案1】:

换句话说,这段代码给出了想要的输出:

for _ in range(4):
    print(a)
    add(a, b)

但这不是:

data = []
for _ in range(4):
    data.append(a)
    add(a, b)

for d in data: 
    print(d)

让我们先看一个简单的例子,它会帮助你理解发生了什么:

In [184]: a = zeros(3)

In [185]: a
Out[185]: array([ 0.,  0.,  0.])

In [186]: b = a

In [187]: b[0] = 99

In [188]: print(a)
[ 99.   0.   0.]

你明白会发生什么吗?我们将数组b 与数组a 相同,然后修改数组b 也会更改数组a

发生这种情况,因为实际上只有 1 个数组对象! “变量”ab 只是同一个底层对象的两个名称。因此,我们可以使用名称b 修改数组,如果使用名称a,我们也会看到更改,因为它是同一个数组。

如果将a 附加到列表中,也会发生同样的情况。该列表包含对对象的引用。但是在您的情况下,引用都指向同一个对象!

解决这个问题的一种方法是在每次将数组附加到列表时创建一个新的数组对象:

data = []
for _ in range(4):
    data.append(a.copy())
    add(a, b)

【讨论】:

  • 谢谢你的详细解答,真的很有帮助~python中也有'reference'的概念,和c++一样,还有很多要学~
猜你喜欢
  • 2022-01-16
  • 2017-02-11
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多