将新形状传递给`np.reshape`

时间:2017-10-01 00:59:39

标签: python python-3.x numpy

numpy.ndarray.reshape内,shape参数是 int或int的元组

  

新形状应与原始形状兼容。如果   整数,那么结果将是该长度的一维数组。

文档签名只是:

# Note this question doesn't apply to the function version, `np.reshape`
np.ndarray.reshape(shape, order='C')

在实践中,规范似乎并不严格。从上面的描述我希望需要使用:

import numpy as np
a = np.arange(12)
b = a.reshape((4,3))  # (4,3) is passed to `newshape`

但我只能逃脱:

c = a.reshape(4,3)  # Seems like just 4 would be passed to `newshape`
                    #     and 3 would be passed to next parameter, `order`
print(np.array_equal(b,c))
# True

我怎么能这样做?我知道如果我只是简单地将2, 3输入到Python shell中,从技术上讲,无论是否使用括号,它都是一个元组。但上面的比较似乎违反了如何将位置参数传递给关键字args的dict的基本规律。即:

def f(a, b=1, order='c'):
    print(a)
    print(b)

f((4,3))
print()
f(4,3)

# (4, 3)
# 1
#
# 4
# 3

... reshape中没有明星运营商。 (类似于上面的def f(*a, order='c')。)

2 个答案:

答案 0 :(得分:2)

使用普通Python方法绑定参数的方式,它应该不起作用,但该方法根本不是Python方法。 Numpy是CPython的扩展模块,numpy.ndarray.reshape实际上是implemented in C

如果查看实现,order参数只能作为关键字参数读取。与普通的Python方法不同,位置参数永远不会绑定到它,而第二个位置参数将绑定到order。 C代码尝试从所有位置参数构建newshape的值。

答案 1 :(得分:2)

没有任何魔法可言。函数的签名与文档不匹配。它被记录为

ndarray.reshape(shape, order='C')

但它是用C语言编写的,而不是用C-api代替

def reshape(self, shape, order='C'):

它使C-api等同于手动*args**kwargs处理。您可以查看numpy/core/src/multiarray/methods.c。 (注意,def reshape(self, shape, order='C'):的C-api等价物将具有与当前代码相同的C级签名,但它会立即使用PyArg_ParseTupleAndKeywords之类的东西来解析参数而不是手动处理。)