从一周前的一个类似的问题:How to understand ndarray.reshape function?
np.reshape(a, newshape)
被重铸为a.reshape(newshape)
。但a.reshape
是一种内置的编译方法。因此,它如何处理newshape
的细节是隐藏的(对于Python程序员)。
这些示例显示newshape
可以是元组或单独的数字。但从某种意义上说,即使是单独的数字情况下也使用元组。函数的参数作为元组传递。
这可能是最明显的索引。 a[:,1,3]
由口译员翻译成a.__getitem__((slice(None),1,3))
致电。而且实际上a[(:,1,3)]
是允许的,因为是ind = (slice(None),1,3); a[ind]
。
可以很容易地编写自己的函数,使得()
可选的额外层:
In [58]: def foo(*args):
...: if len(args)==1:
...: args = args[0]
...: print(args)
...:
In [59]: foo(1,2,3)
(1, 2, 3)
In [60]: foo((1,2,3))
(1, 2, 3)
我需要完善多一点对待这2个相同的情况下:
In [61]: foo(1)
1
In [62]: foo((1,))
(1,)
如果我将函数定义为def foo(arg):
,那么如果我想给它几个数字,就必须使用元组。
希望这可以让大多数有经验的Python程序员为什么不被这些差异所困扰。通常,元组只是将值分组的一种便利方式。它可以增加清晰度,但并不总是需要。编码器可以朝着任何方向发展 - 无论是否存在,还是做了大量工作。
===================
的重塑方法在numpy/core/src/multiarray/methods.c
定义(在GitHub的numpy的储存库)。虽然写在c
它似乎是
def reshape(self, *args, **kwargs):
n = len(args)
if n<=1:
newshape = <parse args[0] in one way>
else:
newshape = <parse args in another way>
return PyArray_Newshape(self, newshape, order)
相当于在任何情况下,它正在分析等等这些都是一样的:
shape=(2,3)
np.arange(6).reshape(shape)
np.arange(6).reshape(*shape)
np.arange(6).reshape(2,3)
np.arange(6).reshape((2,3))
np.arange(6).reshape((2,)+(3,))