np.c_当参数是列表或元组时,输出会有所不同.考虑以下三行的输出
np.c_[[1,2]]
np.c_[(1,2)]
np.c_[(1,2),]
Run Code Online (Sandbox Code Playgroud)
使用list参数np.c_,按预期返回列数组.当参数是元组(第二行)时,它返回一个2D行.在元组(第三行)之后添加逗号将返回与第一次调用相同的列数组.
有人可以解释这种行为背后的理由吗?
有两种常见用例np.c_:
np.c_ 可以接受一系列1D数组:
In [98]: np.c_[[1,2],[3,4]]
Out[98]:
array([[1, 3],
[2, 4]])
Run Code Online (Sandbox Code Playgroud)或者,np.c_可以接受一系列2D数组:
In [96]: np.c_[[[1,2],[3,4]], [[5,6],[7,8]]]
Out[96]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
Run Code Online (Sandbox Code Playgroud)所以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.
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |