我想了解为什么在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]]
答案 0 :(得分:0)
问题很简单,就是您调用mul2()
的方式。
您正在计算以下内容:
mul2(5)
根据您对mul2()
的定义,行h *= h
的作用是将h * 5
存储到h
,并且由于h
为{{1 }},您得到的是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...
,结果将类似于mul2(h, 5)
。
如果您希望不修改原始输入,则可以执行以下操作:
mul(h)
甚至更好:
def mul3(h, n=5):
g = h.copy()
g *= n
print(g) # see above
这将使用所包含的修改在def mul3(h, n=5):
return h * n
中创建数组的副本,您可以h
或执行任何操作。
请注意,修改函数的输入不是一个好习惯。当然,有一些用例,但是我建议您很好地记录下来。
答案 1 :(得分:0)
互联网上的大家好, 非常感谢您的回答。所以也许在翻译过程中有些东西丢失了,但是我想知道为什么 mul 做什么,并且处理和工作流程与 mul2 不同。
解决方案:
g = np.copy(h)
在这里,Numpy和Python的行为有所不同,因为numpy仅指向数组。我认为这是numpy这么快的原因之一。尽管如此,您还是要对数组进行操作,它是在数组中的某个位置完成并覆盖数组。如上所示,可以绕过复制。 (将创建一个新的数组。)(我认为解释不完全正确,但我希望其他人容易理解该解释。)