python - 了解如何为 numpy reshape() 指定新的形状参数

标签 python numpy

我是 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); [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() 指定新的形状参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069988/

相关文章:

python - 用 Python 查找星期一的日期

python - 如果涉及 Inf,为什么稀疏矩阵的矩阵乘法与密集矩阵的乘法不同?

python - 将图像转换为像素阵列

python - 一定范围内的随机数组

php - 试图对值(value)观进行分组?

python - 在python中将带有时区缩写的非UTC时间字符串转换为UTC时间,同时考虑夏令时

python - Matplotlib 子图缺少网格

python - 快速高效的pandas groupby sum操作

python - Python 神经网络中不需要的 [Nan] 输出

python - 更新我的类和创建 Sprite 的方式后,移动的功能不再起作用