3 回答
TA贡献1815条经验 获得超12个赞
Y = np.array([[1,2,3],[4,5,6]])
这将创建一个 (2,3) 数组。
v = np.append(Y, [[7,8,9]], axis=0)
这实际上是实现为
v = np.concatenate(( Y, np.array([[7,8,9]]) ), axis=0)
也就是说,它将 (2,3) 数组与轴 0 上的 (1,3) 连接起来形成 (3,3)。
q = np.append(Y,[[9],[10]], axis=1)
在这里,它在轴 1 上将 (2,3) 与 (2,1) 连接起来,得到 (2,4)
np.concatenate
除非您指定,否则假定轴为 0。它不会尝试猜测哪个轴有效或无效。在这种q
情况下使用轴 0 会导致错误。
还concatenate
需要匹配维度数量以及非连接轴上的匹配大小。尝试类似的事情np.concatenate((Y, [2,1]))
看看我的意思。
我不喜欢np.append
,因为它看起来太像列表附加,并且给初学者带来了很多问题。如果没有轴,它就会破坏输入(如果不明显,请阅读文档和代码)。concatenate
对于 axis,它与(再次阅读代码) 相同。concatenate
接受许多数组的列表,而不仅仅是 2。 np.append
人为地将操作限制为 2。
np.vstack
、np.hstack
、 和np.column_stack
是在调用 之前以各种方式调整输入尺寸的变体concatenate
。它们补偿了一些不匹配,例如连接行时:
np.vstack((Y, [7,8,9]))
在连接之前将 (3,) 数组转换为 (1,3)。实际上,这是一种方便且安全的“事后猜测”。它很少会出现诸如 之类的问题np.append
。
numpy
(和 Python)试图避免歧义。与再次猜测用户相比,更有可能引发错误。发展的趋势是消除允许“破坏规则”的遗留案例。
TA贡献1817条经验 获得超14个赞
只是视觉上的补充:
# (3, 2) (3, 1)
#
# [[1, 4], | [[7],
# [2, 5], | [8],
# [3, 6]] | [9]],
# ---------
# [[7, 8]]
#
# (1, 2)
连接两个数组时
数组必须具有相同的形状,除了对应的维度axis
# (i, j0 , k)
# + (i, j1, k) # (concatenate)
# ---------------
# = (i, j0+j1, k)
你是对的,当将一维数组连接到二维数组时,轴参数应该足以明确地组合两个数组,即使没有维度匹配,但嵌套括号有助于使这一点更加明确,
TA贡献1827条经验 获得超9个赞
append
与 非常相似concatenate
:它沿着现有轴合并两个数组。括号是我们定义跨维度分布元素的方式。
Y
是形状(2, 3)
。这意味着如果您想附加到第一个轴,额外的数据必须具有 shape (M, 3)
。如果要附加到第二个轴,新数据必须具有形状(2, N)
。这可以推广到任意数量的维度:新数组的所有维度(除了要附加的维度之外)都必须具有相同的形状。
该数组[[7, 8, 9]]
具有M = 1
:其形状为(1, 3)
,因此您可以将其附加到第一个轴就好了。这会向 . 添加额外的行Y
。如果您尝试附加类似 的内容[[7], [8], [9]]
,则会收到错误,因为形状现在是(3, 1)
。如果你尝试这样做,你最终不会得到一个统一的数组。
该数组[[9], [10]]
具有N = 1
:其形状为(2, 1)
,因此您可以将其附加到第二个轴。这会向Y
. [[9, 10]]
有形状(1, 2)
,所以显然它不起作用。
axis
该关键字没有为您提供足够信息的原因是您并不总是附加单行或列。举个例子:
np.append(Y, Y, axis=0) np.append(Y, Y, axis=1)
添加回答
举报