如何为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]
答案 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