NumPy中函数参数中的"size"和"shape"有什么区别?

23

我注意到一些numpy操作使用一个名为shape的参数,例如np.zeros,而其他一些操作使用一个名为size的参数,例如np.random.randint。对我来说,这些参数具有相同的功能,它们有不同的名称有点令人困惑。实际上,size似乎有些不合适,因为它实际上指定了输出的.shape

是否有不同的命名原因,它们传达了不同的含义,即使它们最终都等于输出的.shape


5
我不这么认为。它是社区开发的,确保一致性并不总是容易的。我同意你的观点。在NumPy上下文中,“shape”似乎是更好的参数名称选项。实际上,两者之间的关系是 size = np.prod(shape),因此参数名称的区别确实应该更加明显。 - armatita
1
randint使用size参数名称,但在解释中使用shape。这不应与真正的size属性混淆。 - hpaulj
我建议您更改标题,以更好地反映您谈论的是参数名称而不是属性。 - Mayou36
@Mayou36 好建议。已完成。 - P-Gn
也许你可以鼓励他们将评论转化为答案! - ViktorStein
显示剩余3条评论
3个回答

12

形状指的是N维数组的维度大小。

大小指的是数组中包含的元素数量(或个数)(有时也可以表示为数组的顶部维度,当用作长度时)。

例如,假设a是一个矩阵。

1  2  3  4
5  6  7  8
9 10 11 12

a 的形状为 (3, 4)a 的大小为 12,a[1] 的大小为 4。


10
我认为 OP 已经理解了。他/她质疑参数名称的选择。例如,randint 要求一个大小(int),但实际上可以接受元组(在 numpy 中通常被解释为形状)。 - armatita
我认为我们可以说 a.shape.prod() = a.size - Euler_Salter
1
@Euler_Salter,是的,但这不是问题所在。问题在于参数名称shapesize。在参数中,它们具有相同的目的,并且不遵循您指出的关系。(它们遵循shape == size - Mayou36

1
因为你正在使用一个被视为C数组的numpy数组,所以size指的是你的数组有多大。此外,如果你可以传递np.zeros(10)np.zeros((10))。虽然差别微小,但这种方式传递的size将为您创建一个1D数组。您可以给size=(n1, n2, ..., nn),这将创建一个nD数组。
然而,由于Python用户想要多维数组,array.reshape允许您从1D获取到nD数组。因此,当您调用shape时,您会得到数组的N维形状,因此您可以准确地看到您的数组的外观。
实质上,size等于shape元素的乘积。

编辑:名称的差异可以归因于两个部分:首先,您可以使用大小初始化数组。但是,您不知道它的形状。因此,size仅用于元素的总数。其次,numpy的开发方式不同,不同的人在代码的不同部分工作,根据他们对代码的个人看法,为大致相同的元素赋予不同的名称。


我不确定你想用 np.zeros(10)np.zeros((10)) 的区别来解释什么。你是不是指的是 np.zeros((10, ))(也就是说,第二个实际上是一个元组)? - alichaudry

0
随机数组:
[[-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]]

这里有一个区别:
print(your_np_arr.shape)  # (3, 5)
print(your_np_arr.size)   # 15

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