为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2023-09-05 17:33:34
我正在通过 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,不是吗?
查看完整描述

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.vstacknp.hstack、 和np.column_stack是在调用 之前以各种方式调整输入尺寸的变体concatenate。它们补偿了一些不匹配,例如连接行时:

np.vstack((Y, [7,8,9]))

在连接之前将 (3,) 数组转换为 (1,3)。实际上,这是一种方便且安全的“事后猜测”。它很少会出现诸如 之类的问题np.append

numpy(和 Python)试图避免歧义。与再次猜测用户相比,更有可能引发错误。发展的趋势是消除允许“破坏规则”的遗留案例。


查看完整回答
反对 回复 2023-09-05
?
大话西游666

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)

你是对的,当将一维数组连接到二维数组时,轴参数应该足以明确地组合两个数组,即使没有维度匹配,但嵌套括号有助于使这一点更加明确,


查看完整回答
反对 回复 2023-09-05
?
素胚勾勒不出你

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)


查看完整回答
反对 回复 2023-09-05
  • 3 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信