我是 python 数据分析的新手,并试图弄清楚如何将多维数组操作到不同的维度。网上的教程或论坛没有说明如何为numpy.reshape(a, newshape, order='C')
指定“newshape”的参数
这是我试图理解的一个例子。如果有人可以解释第 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
最佳答案
一周前的一个类似问题: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)
我需要进一步完善它以将这两种情况相同对待:
In [61]: foo(1)
1
In [62]: foo((1,))
(1,)
如果我将函数定义为
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)
无论如何,它正在被解析,所以这些都是一样的:
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,))
关于python - 了解如何为 numpy 的 reshape() 指定 newshape 参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39069988/