如何将一个NumPy数组附加到另一个NumPy数组

12
我正在尝试填充一个由NumPy数组组成的NumPy数组。每次完成循环迭代时,我都会创建要添加的数组。然后,我想将该数组附加到另一个数组的末尾。例如:
first iteration
  np.append([], [1, 2]) => [[1, 2]]
next iteration
  np.append([[1, 2]], [3, 4]) => [[1, 2], [3, 4]]
next iteration
  np.append([[1, 2], [3, 4]], [5, 6]) => [[1, 2], [3, 4], [5, 6]]
etc.

我尝试使用np.append,但是它返回一个一维数组,即:

[1, 2, 3, 4, 5, 6]

2
查找 np.vstack,虽然我建议为了效率先创建一个二维 Python 列表,使用 append,并且只在最后调用 np.array - Julien
使用numpy.append可能并不直观。根据https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html,如果您使用axis,则要附加的数组必须与其被附加到的数组具有相同的维度。如果您不使用axis,则将附加的值在使用之前被压平。 - opensam
@Julien 我简直不敢相信我没有想到那个。除了效率之外,它似乎更加直接,因为在我计算完整个二维数组之前,我实际上并没有对需要以NumPy格式存在的数据进行任何操作。谢谢。 - UBears
3个回答

8

将数组嵌套,使其具有多个轴,并在使用 append 时指定轴。

import numpy as np
a = np.array([[1, 2]]) # note the braces
b = np.array([[3, 4]])
c = np.array([[5, 6]])

d = np.append(a, b, axis=0)
print(d)
# [[1 2]
#  [3 4]]

e = np.append(d, c, axis=0)
print(e)
# [[1 2]
#  [3 4]
#  [5 6]]

或者,如果您坚持使用列表,请使用numpy.vstack

import numpy as np
a = [1, 2]
b = [3, 4]
c = [5, 6]

d = np.vstack([a, b])
print(d)
# [[1 2]
#  [3 4]]

e = np.vstack([d, c])
print(e)
# [[1 2]
#  [3 4]
#  [5 6]]

对于 numpy.vstack,我猜你的意思是“使用数组列表”? - James Hirschorn
为了更接近原始代码,您还可以创建一个在一个维度上大小为0的numpy数组,然后使用append。类似于final_stack = np.zeros((0, 2)); a = [[1, 2]]; final_stack = np.append(final_stack, a, axis=0) - chenjesu

6

我发现使用numpy和这段代码很方便。例如:

loss = None
new_coming_loss = [0, 1, 0, 0, 1]
loss = np.concatenate((loss, [new_coming_loss]), axis=0) if loss is not None else [new_coming_loss]

实际应用:

self.epoch_losses = None
self.epoch_losses = np.concatenate((self.epoch_losses, [loss.flatten()]), axis=0) if self.epoch_losses is not None else [loss.flatten()]

复制粘贴解决方案:

def append(list, element):
    return np.concatenate((list, [element]), axis=0) if list is not None else [element]

警告:列表和元素的维度应该相同,除了第一个维度以外,否则您将会得到以下错误:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

1
免责声明:添加数组应该是例外情况,因为效率低下。
话虽如此,您可以通过指定轴来实现您的目标。
a = np.empty((0, 2))
a = np.append(a, [[3,6]], axis=0)
a = np.append(a, [[1,4]], axis=0)

如果追加操作效率低下,你会推荐使用哪种方式? - Jürgen K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接