了解如何为 numpy 的 reshape() 指定 newshape 参数

LED*_*tom 4 python numpy

我是Python数据分析的新手,并试图弄清楚如何将多维数组操作为不同的维度。在线教程或论坛没有解释如何指定“newshape”的参数numpy.reshape(a, newshape, order='C')

这是我试图理解的一个例子。如果有人能解释第 4 行,那将会非常有帮助。

import numpy as np
a1 = np.arrange(8).reshape( (8,1) ) 
b = np.repeat(a1,8,axis=1)
c = b.reshape(2,4,2,4)               # line 4
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 5

一周前的类似问题:How to Understanding ndarray.reshape function?

np.reshape(a, newshape)被重铸为a.reshape(newshape). 但是a.reshape是一个内置的编译方法。所以它如何处理的细节newshape是隐藏的(对于Python程序员来说)。

这些示例表明它newshape可以是一个元组,也可以是单独的数字。但从某种意义上说,即使是单独的数字情况也使用元组。函数的参数作为元组传递。

这对于索引来说可能是最明显的。 a[:,1,3]被解释器翻译成a.__getitem__((slice(None),1,3))call。事实上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)
Run Code Online (Sandbox Code Playgroud)

我需要进一步完善它以同样对待这两种情况:

In [61]: foo(1)
1    
In [62]: foo((1,))
(1,)
Run Code Online (Sandbox Code Playgroud)

如果我将函数定义为def foo(arg):,那么如果我想给它几个数字,我就必须使用元组。

希望这能让大家明白为什么大多数有经验的 Python 程序员不会被这些差异所困扰。通常,元组只是对值进行分组的一种便捷方式。它可以增加清晰度,但并不总是需要的。编码员可以选择任何一个方向——掩盖他们的存在或不存在,或者小题大做。

===================

reshape 方法定义在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)
Run Code Online (Sandbox Code Playgroud)

无论如何,它都会被解析,因此这些都是相同的:

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,))
Run Code Online (Sandbox Code Playgroud)