Numpy操作*=正在重复,尽管它是';函数中的s

Numpy操作*=正在重复,尽管它是';函数中的s,numpy,copy,deep-copy,Numpy,Copy,Deep Copy,我想了解为什么在Numpy的情况下,尽管函数调用,我还是不删除数组 在函数调用的情况下,mul2应该发生什么。但是,如果我对mul进行完全相同的尝试,我会有一种对原始数组的引用 我怎样才能解决这个问题?我是否必须先“复制”数组,然后将其放入函数中?或者我可以在函数中创建一个副本,然后将其删除?这里有什么更好的 import numpy as np def mul(h): #g = np.zeros([h.shape[0],h.shape[0]]) g = h g[:,0] *=

我想了解为什么在Numpy的情况下,尽管函数调用,我还是不删除数组

在函数调用的情况下,mul2应该发生什么。但是,如果我对mul进行完全相同的尝试,我会有一种对原始数组的引用

我怎样才能解决这个问题?我是否必须先“复制”数组,然后将其放入函数中?或者我可以在函数中创建一个副本,然后将其删除?这里有什么更好的

import numpy as np

def mul(h):
  #g = np.zeros([h.shape[0],h.shape[0]])
   g = h
   g[:,0] *= 5
   print(g)

def mul2(h):
  h *= h
  print(h)

a = np.array([[1,2,3,4], [2,3,4,5], [3,4,5,6]])

for i in range(2):
  mul(a)
for i in range(2):
  mul2(5)
结果是:

[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]

[[25  2  3  4]
[50  3  4  5]
[75  4  5  6]]

25
25
但是从mul2的行为来看,我希望这是一个解决方案:

[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]
[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]
g = np.copy(h)

问题很简单,就是调用
mul2()
的方式。 您要做的是计算以下各项:

mul2(5)
根据您对
mul2()
的定义,行
h*=h
的作用是将
h*5
存储到
h
,并且由于
h
5
,所以您得到的是
h=5*5
,因此您的
25
被打印出来

您可能想做的是:

def mul2(h, n=5):
    h *= n
    print(h)  # not sure you really want this inside your function besides for debugging purposes, and even then...
def mul3(h, n=5):
   g = h.copy()
   g *= n
   print(g)  # see above
这是您想要的:

mul2(h, 5)
并将产生类似于
mul(h)
的结果

如果希望不修改原始输入,可以执行以下操作:

def mul2(h, n=5):
    h *= n
    print(h)  # not sure you really want this inside your function besides for debugging purposes, and even then...
def mul3(h, n=5):
   g = h.copy()
   g *= n
   print(g)  # see above
或者更好:

def mul3(h, n=5):
   return h * n
这将在
h
中创建一个包含修改的数组副本,您可以
print()
或执行任何需要的操作


请注意,修改函数的输入不是好的做法。当然也有这样的用例,但我建议您将其记录得非常好。

大家好,来自互联网的朋友们, 非常感谢你的回答。因此,在翻译过程中可能会丢失一些东西,但我想知道为什么mul会这样做,并且处理和工作流与mul2不同

对于解决方案:

[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]
[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]
g = np.copy(h)

Numpy和Python在这里的行为不同,因为Numpy只指向数组。我认为这是numpy如此之快的原因之一。尽管如此,您对数组执行一个操作,它在数组中的位置执行并覆盖数组。如上所示,这可以通过复制绕过。(将创建一个新的数组。)(我不认为这个解释很正确,但我希望这个解释对其他人来说很容易理解。)

*=
修改当前的值-例如:它用结果值更改它操作的数组
g=h
不创建副本-它只是将名称
g
绑定到
h
绑定到的对象。。。因此,同一个数组只有两个名称…问题是
numpy
数组是通过引用传递的(有点…),因此函数不会创建数组的本地副本。这必须手动完成,使用
.copy()
方法.Jup,就像我发现的一样。np.copy就是这个解决方案。我自己回答了这个问题,并作了解释。我确实认为,你最初提出的问题的表述方式与这个答案的内容不匹配,尽管这可能是你遗漏的信息。也许你应该考虑更新你的问题,如果这是你所追求的。事实上,我非常确信,无论你在
np.copy()
中定义了多少
mul2()
,如果你这样称呼它,即
mul2(5)
,你永远不会得到与原始问题中的内容相关的结果,正如你预期的结果所表明的那样。