在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')
。)
答案 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
之类的东西来解析参数而不是手动处理。)