Numpy操作*=正在重复,尽管它是';函数中的s
我想了解为什么在Numpy的情况下,尽管函数调用,我还是不删除数组 在函数调用的情况下,mul2应该发生什么。但是,如果我对mul进行完全相同的尝试,我会有一种对原始数组的引用 我怎样才能解决这个问题?我是否必须先“复制”数组,然后将其放入函数中?或者我可以在函数中创建一个副本,然后将其删除?这里有什么更好的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] *=
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)
,你永远不会得到与原始问题中的内容相关的结果,正如你预期的结果所表明的那样。