当前位置: 首页 > 面试题库 >

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

越宣
2023-03-14
问题内容

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

尽管在每一步中我都只更改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

问题答案:

问题是,当您将值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


 类似资料:
  • 问题内容: 我有以下代码,该代码创建灰度BufferedImage,然后设置每个像素的随机颜色。 在大约25%到30%的像素中会发生奇怪的行为,我在其中设置颜色,然后立即设置颜色,使其与之前设置的值不同。我是否以错误的方式设置颜色? 问题答案: 这是您的解决方案:禁止getRGB并使用Raster(比getRGB更快,更容易)或更好的DataBuffer(最快,但必须处理编码): 在您的情况下,g

  • 问题内容: 我在变量范围方面遇到麻烦。 我期望输出到,但结果是。为什么我在方法中更改了数组中的值,但是原来的数组却更改了? 问题答案: Java中的数组是一个对象。当您通过创建数组时,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。 在C语言中,这表示为: 当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参

  • 问题内容: 我正在使用NumPy在Python中使用标准方法创建对称矩阵/数组: 现在让我们变得聪明: 等一下 左上和右下部分是对称的。如果我选择了较小的阵列怎么办? 好.... 只是要确保… 这是一个错误,还是我要学习一些有关NumPy数组的疯狂知识? 问题答案: 该操作返回该数组的 视图 ,这意味着未分配新数组。反过来,这意味着您正在同时读取和修改阵列。很难说出为什么某些大小或结果区域起作用的

  • 我对变量的作用域有问题。 我希望输出为,但结果是。为什么我在方法中改变了数组中的值,而原来的数组却改变了?

  • 问题内容: 当以某种出乎意料的方式执行特定切片时,numpy数组的形状正在改变 我尝试了将同一阵列切成薄片的几种方法,但是细微的差异会导致阵列形状的结果不同 在最后两个示例中,我不明白为什么最后一个轴移动到第一个位置。 我使用与 问题答案: 在最后两种情况下可能会发现结果出乎意料的原因是,即使您也使用切片进行索引,但数组的索引仍遵循高级索引的规则。 有关此行为的详细说明,您可以检查结合使用高级索引

  • 让我们开始讨论这个问题 但为什么会导致 我期待结果 我用nodejs得到的结果