np.c_与list和tuple参数的行为

P-G*_*-Gn 7 python numpy

np.c_当参数是列表或元组时,输出会有所不同.考虑以下三行的输出

np.c_[[1,2]]
np.c_[(1,2)]
np.c_[(1,2),]
Run Code Online (Sandbox Code Playgroud)

使用list参数np.c_,按预期返回列数组.当参数是元组(第二行)时,它返回一个2D行.在元组(第三行)之后添加逗号将返回与第一次调用相同的列数组.

有人可以解释这种行为背后的理由吗?

unu*_*tbu 6

有两种常见用例np.c_:

所以np.c_可以通过1D数组喜欢或2D数组喜欢.但这提出了一个问题,如何np.c_确认输入是否是单个2D数组(例如[[1,2],[3,4]])或一维数组序列(例如[1,2] ],[3,4])?

开发人员做出了一个设计决定:如果np.c_传递了一个元组,那么该参数将被视为一系列独立的数组.如果传递非元组(例如列表),则该对象将被视为单个数组.

因此,np.c_[[1,2], [3,4]](相当于np.c_[([1,2], [3,4])])将([1,2], [3,4])视为两个独立的1D阵列.

In [99]: np.c_[[1,2], [3,4]]
Out[99]: 
array([[1, 3],
       [2, 4]])
Run Code Online (Sandbox Code Playgroud)

相反,np.c_[[[1,2], [3,4]]][[1,2], [3,4]]视为单个2D阵列.

In [100]: np.c_[[[1,2], [3,4]]]
Out[100]: 
array([[1, 2],
       [3, 4]])
Run Code Online (Sandbox Code Playgroud)

那么,对于您发布的示例:

np.c_[[1,2]]视为[1,2]单个1D数组,因此它使[1,2]成为2D数组的列:

In [101]: np.c_[[1,2]]
Out[101]: 
array([[1],
       [2]])
Run Code Online (Sandbox Code Playgroud)

np.c_[(1,2)]视为(1,2)2个独立的数组,因此它将每个值放入其自己的列中:

In [102]: np.c_[(1,2)]
Out[102]: array([[1, 2]])
Run Code Online (Sandbox Code Playgroud)

np.c_[(1,2),]将元组(1,2),(相当于((1,2),))视为一个类似数组的序列,以便将数组视为一列:

In [103]: np.c_[(1,2),]
Out[103]: 
array([[1],
       [2]])
Run Code Online (Sandbox Code Playgroud)

PS.也许比大多数软件包更多,NumPy有不同处理列表和元组的历史.该链接讨论了传递给列表和元组时如何区别对待np.array.