作为numpy.array附加的函数

时间:2015-02-14 13:11:02

标签: python arrays numpy

如何为numpy.array编写一个类似于array.append()的函数?

我试过这个

import numpy as np

def append_np(ar, el):
    ar = np.append(ar, el)
z = np.array([5], dtype='int32')
z = np.append(z, 6)
append_np(z, 7)
print z

但此代码仅附加“6”:

[5 6]

1 个答案:

答案 0 :(得分:3)

  

"就像array.append()"

一样

首先,Python中的数据结构很可能在这里称为" array"被称为" list"。

然后,Python列表和Numpy数组的append()方法表现出根本不同。假设l是一个Python列表。 l.append()就地修改列表并返回None。相反,Numpy的append()数组方法不会改变它所操作的数组。它返回一个新的数组对象。

请参阅:http://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html

  

带有附加到轴的值的arr副本。请注意,追加不会   就地发生:分配并填充新数组。

这解释了为什么您需要返回append_np()函数的结果并指定返回值,如new_z = append_np(z, 7)

您可能已将此函数用于Python列表:

def append(ar, el):
    ar = ar.append(el)

并称之为:

z = [1, 2]
append(z, 7)
print z

你已经看到它确实修改了你的z。但为什么,这个功能发生了什么?作为第一个参数传递的对象(绑定到名称ar)已就地修改。这就是为什么z"在外面"改变。你在不知情的情况下利用了这个功能的副作用,这很危险。 函数中,名称ar被重新分配给None单例对象(这是列表追加方法的返回值)。您没有返回此对象或使用它,因此此分配在您的程序中没有用处。您发现自己这种方法存在问题,因为当您将函数重新构造为append_np()时,您突然意识到它没有副作用"在z

也就是说,对于Python列表,您不会将追加操作外包到另一个函数中。你可以从一开始就说:

z = [1, 2]
z.append(7)
print z