【问题标题】:Numpy array pass-by-valueNumpy 数组按值传递
【发布时间】:2017-12-19 19:24:42
【问题描述】:

我有一个由函数更改的 numpy 数组。 调用函数后我要处理数组的初始值(调用修改函数之前的值)

# Init of the array
array = np.array([1, 2, 3])

# Function that modifies array
func(array)

# Print the init value [1,2,3]
print(array)

有没有办法按值传递数组,还是我有义务进行深拷贝?

【问题讨论】:

  • 在进入 func 之前保存一份副本并稍后使用?
  • 是的,你是。 Numpy 数组是可变对象,因此对其所做的任何更改都会反映在指向该对象的所有变量中。如果您不希望这样,请发送.copy()
  • Python 不支持多种求值策略。如果您想处理副本,您必须制作副本。你不应该需要深拷贝,除非你有一个numpy数组object类型...
  • 你不需要来自copy模块的deepcopy(),而是np.array方法zzz.copy(),其中zzz是一个ndarray
  • 调用它array 不会使它成为一个数组...

标签: python arrays numpy move-semantics


【解决方案1】:

正如我所提到的,np.ndarray 对象是可变数据结构。这意味着引用特定对象的任何变量都将反映对对象进行更改时的更改。

但是,请记住,大多数 numpy 转换数组的函数会返回新的数组对象,而保持原始数组对象不变。

在这种情况下您需要做什么取决于您正在做什么。如果您的函数修改了相同的数组,那么您需要将副本传递给该函数。您可以使用np.ndarray.copy 来执行此操作。

【讨论】:

  • 为我工作。尝试改进答案,使用-new_array = np.ndarray.copy(array_needs_to_be_copied)
【解决方案2】:

您可以使用以下库 (https://pypi.python.org/pypi/pynverse) 来反转您的函数并调用它,如下所示:

from pynverse import inversefunc

cube = (lambda x: x**3)
invcube = inversefunc(cube)

arr = func(arr)

In [0]: arr
Out[0]: array([1, 8, 27], dtype=int32)

In [1]: invcube(arr)
Out[1]: array([1, 2, 3])

【讨论】:

  • "不幸的是,如果您调用 arr = func(arr),没有简单的方法可以将 arr 保存在内存中。"当然有。 arr2 = arr; arr = func(arr)
  • 另外,“如果你不将 func 修改的新数组分配给数组,那么 print(array) 仍然会显示初始值”在 general中不正确>。考虑函数def func(a): a[0] = 42
  • 如果你有def func(arr): arr *= 2怎么办?
  • 你们是对的,编辑了我的答案以消除这些错误!
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2012-05-06
  • 2020-05-23
  • 2014-09-30
  • 2014-02-19
相关资源
最近更新 更多