numpy数组尽管更改了另一个数组却意外地意外更改

发布于 2021-01-29 18:02:37

我在大型代码中发现了一个错误,并将问题简化为以下情况。

尽管在每一步中我都只更改w2,但是在每一步中我都打印时w1,它也会更改,因为在第一循环的结尾我将它们分配为相等。我读过这篇文章,但是写了一些,以防我w1 = w2[:]能解决问题,但事实并非如此

import numpy as np
import math

w1=np.array([[1,2,3],[4,5,6],[7,8,9]])
w2=np.zeros_like(w1)
print 'w1=',w1
for n in range(0,3):
    for i in range(0,3):
        for j in range(0,3):
            print 'n=',n,'i=',i,'j=',j,'w1=',w1
            w2[i,j]=w1[i,j]*2

    w1=w2[:]


#Simple tests
# w=w2[:]
# w1=w[:]

# p=[1,2,3]
# q=p[:];
# q[1]=0;
# print p
关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题是,当您将值w1从分配回时,w2您实际上并没有将值从传递w1w2,而是实际上是将两个变量指向 同一对象

    您遇到的问题

    w1 = np.array([1,2,3])
    w2 = w1
    
    w2[0] = 3
    
    print(w2)   # [3 2 3]
    print(w1)   # [3 2 3]
    
    np.may_share_memory(w2, w1)  # True
    

    解决方案

    相反,您将需要复制 。使用numpy数组有两种常见的方法。

    w1 = numpy.copy(w2)
    w1[:] = w2[:]
    

    示范

    w1 = np.array([1,2,3])
    w2 = np.zeros_like(w1)
    
    w2[:] = w1[:]
    
    w2[0] = 3
    
    print(w2)   # [3 2 3]
    print(w1)   # [1 2 3]
    
    np.may_share_memory(w2, w1)   # False
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看