函数中的NumPy数组更改

2024-03-28 15:31:44 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码

def change(in_array):

    in_array += 1             # line a

    in_array = in_array + 1   # line b


x = np.array([1, 2, 3])
change(x)
print(x)

打印[2 3 4]。为什么会这样(为什么a和b两行不同)?您能否建议其他修改NumPy数组的方法,如在a行中所做的那样?一种方法是in_array[:] = in_array + 1;在in_array[:] = ...的情况下,传入数组的值是否总是会更改


Tags: 方法代码innumpydefnpline情况
1条回答
网友
1楼 · 发布于 2024-03-28 15:31:44

让我们看看下面的代码:

Try it online!

import numpy as np

def change(in_array, variant = 0):
    if variant == 0:
        in_array += 1             # line a
    elif variant == 1:
        in_array = in_array + 1   # line b
    elif variant == 2:
        in_array[:] = in_array + 1
    elif variant == 3:
        np.put(in_array, np.arange(in_array.size), in_array + 1)
    elif variant == 4:
        np.copyto(in_array, in_array + 1)
    elif variant == 5:
        np.place(in_array, np.ones_like(in_array), in_array + 1)
    else:
        assert False, variant
    print('after, inside', in_array)

orig = np.array([1, 2, 3])
for variant in [0, 1, 2, 3, 4, 5]:
    print('variant', variant)
    x = np.copy(orig)
    print('before', x)
    change(x, variant)
    print('after, outside', x, ('changed', 'not changed')[bool(np.all(x == orig))])

它输出:

variant 0
before [1 2 3]
after, inside [2 3 4]
after, outside [2 3 4] changed
variant 1
before [1 2 3]
after, inside [2 3 4]
after, outside [1 2 3] not changed
variant 2
before [1 2 3]
after, inside [2 3 4]
after, outside [2 3 4] changed
variant 3
before [1 2 3]
after, inside [2 3 4]
after, outside [2 3 4] changed
variant 4
before [1 2 3]
after, inside [2 3 4]
after, outside [2 3 4] changed
variant 5
before [1 2 3]
after, inside [2 3 4]
after, outside [2 3 4] changed

您可能会看到变量0在内部和外部给出正确的答案。而变体1仅在内部提供正确的

这是因为变量0修改函数中提供的实际给定数组。变量1在函数内部创建一个修改后的副本,该副本只保留在函数内部,而实际传递的参数不会被修改

因此,变量0修改传递的参数,而变量1修改传递的参数的副本

在Python代码中,函数中的a = a + 1实际上在函数中创建了变量a的副本。这个局部变量只会一直保留到函数结束,并在函数运行结束时被删除

变量2,a[:]创建原始数组的视图,它就像对原始数组元素子集的引用,只是:是整个数组的视图,分配给该视图会修改原始数组。可修改视图也由a[1:3]之类的切片和a[2]a[[1,2]]之类的索引创建

写入a[:] = some_operation(a)可能是将a的修改/转换副本重新分配给a的最直观、最快速的方法

变体3、4、5是将右侧表达式赋回数组a的其他奇特方式

相关问题 更多 >