Numpy操作* =正在重复,尽管它在函数中

时间:2018-09-19 11:20:06

标签: 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] *= 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]]

2 个答案:

答案 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这么快的原因之一。尽管如此,您还是要对数组进行操作,它是在数组中的某个位置完成并覆盖数组。如上所示,可以绕过复制。 (将创建一个新的数组。)(我认为解释不完全正确,但我希望其他人容易理解该解释。)