为什么要使用形状为(x,)的数组而不是(x,1)?

5

最近我遇到了几个由于numpy数组形状为(x,)而导致的bug - 可以通过下面的代码片段轻松修复

a = np.array([1,2,3,4]) #this form produced a bug
a.shape 
>>> (4,)  
a.shape = [4,1] #but this change fixed it 

但这让我想知道,为什么(x,)是1D数组的默认形状?


8
1D数组应该是一维的,但(x, 1)(1, x)是2D数组。它们有两个维度,其中一个设置为1。你能更具体地描述你遇到了什么类型的bug吗?我怀疑这些bug实际上可能是特性 :) - MB-F
最好在出现错误的地方修复bug。 - Stop harming Monica
3个回答

3

shape的元组中每个项目表示一个轴。 如果您只有一个项目,意味着您的数组是1维(1个轴),否则它将是2D数组。 当您执行a.shape = [4,1]时,您只是将1D数组转换为2D数组:

In [26]: a = np.array([1,2,3,4])
In [27]: a.shape = [4,1]

In [28]: a.shape        
Out[28]: (4, 1)

In [29]: a
Out[29]: 
array([[1],
       [2],
       [3],
       [4]])

“wordy” 显示的 (4,1) 数组是不将其作为“向量”默认选项的一个很好的理由。 - hpaulj

1

从文档中引用:

shape : tuple of ints
形状元组的元素给出了相应数组维度的长度。

因此,当您拥有形状为(4, )时,这意味着它的第一个维度中有4个元素。从您的示例中可以看出,这是有意义的,对吧?

相反,如果我们拥有您所说的形状(4, 1),那么它意味着第一维(在NumPy术语中为轴=1)有4个元素,第二维(在NumPy术语中为轴=0)中有1个元素,但这不适用于1D数组。


1
我猜测你提出这个问题是因为你来自Matlab背景,在Matlab中所有数据都被视为矩阵。在Matlab中,所有的一维数据集都被视为行向量或列向量,并且索引被短路处理,因此指定单个索引会将两个向量视为一维列表。
Numpy并不直接处理矩阵,而是处理嵌套列表。列表的列表与Matlab中的矩阵有类似的解释,但有关键的区别。例如,如果你只给一个索引,Numpy不会做任何假设,它的索引行为始终相同,无论嵌套列表的深度如何。
import numpy as np

arr = np.array([1, 2, 3, 4])
print(arr)
>> [1 2 3 4]
print(arr[0])
>> 1

arr.shape = [4, 1]
print(arr)
>> [[1]
>>  [2]
>>  [3]
>>  [4]]
print(arr[0])
>> [1]

arr.shape = [1, 4]
print(arr)
>> [[1 2 3 4]]
print(arr[0])
>> [1 2 3 4]

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