为什么我们在使用 Numpy 追加列和行时对括号的使用不同?

我正在通过 Udacity 课程学习 NumPy。

我们创建一个 2D 矩阵,然后创建另外 2 个数组,一个附加一行,另一个附加一列:

Y = np.array([[1, 2, 3], [4, 5, 6]])
v = np.append(Y, [[7, 8, 9]], axis=0)
q = np.append(Y, [[9], [10]], axis=1)

为什么这两种情况下值列表的语法(使用方括号)不同?我意识到括号的使用与我们创建原始矩阵的顺序相匹配,但解释器似乎对参数有足够的信息axis=n,不是吗?


明月笑刀无情
浏览 190回答 3
3回答

萧十郎

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)试图避免歧义。与再次猜测用户相比,更有可能引发错误。发展的趋势是消除允许“破坏规则”的遗留案例。

大话西游666

只是视觉上的补充:#  (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)你是对的,当将一维数组连接到二维数组时,轴参数应该足以明确地组合两个数组,即使没有维度匹配,但嵌套括号有助于使这一点更加明确,

素胚勾勒不出你

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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python