gpt4 book ai didi

python - NumPy 的 free-function-reshape() 与 member-function-reshape() 的实现?

转载 作者:太空宇宙 更新时间:2023-11-04 11:13:27 24 4
gpt4 key购买 nike

我想澄清一下 NumPy 的自由函数 reshape() 是如何实现的,而不是 nd-array 的成员函数 reshape() 是如何实现的。

例如:

a = np.reshape(np.array([1,2,3]),[3,1])

对比

a = np.array([1,2,3])
a.reshape([3,1])

我知道它们是“不同的”,因为一个是类方法,另一个是函数,但我的问题更多是关于它们是如何编写脚本/实现的。

成员方法是否调用自由函数?

像这样:

import reshape

class array:

def __init__(self,my_array):
self.my_array = my_array

def reshape(self):
self.my_array = reshape(self.my_array)

还是有其他事情发生?这是 NumPy 数组类的类方法的编码方式吗?它是在方法中导入和使用函数,还是在两个函数定义中都复制了相同的代码?你知道我在说什么......

最佳答案

我们已经知道的:

在这个声明中:

a = np.reshape(np.array([1,2,3]),[3,1])

reshape() 是这个 signature 的免费函数. array() 也是一个免费的函数和数组构造函数,带有 signature .

但是,在这些语句中:

a = np.array([1,2,3]) 
a.reshape([3,1])

array() 仍然是一个自由函数和构造函数,但 reshape() 是 nd-array 类/对象的成员函数(方法)。与自由函数 reshape() 不同,the member function, reshape() , 允许将 shape 参数的元素作为单独的参数传入。例如,a.reshape(10, 11) 等同于 a.reshape((10, 11))。

回答问题:

这些的实际实现有点难以理解,因为 numpy 的核心功能是用 C 实现的。正如@hpaulj 所说,reshape() 委托(delegate)是对已编译代码的神秘调用。

我怀疑 reshape 代码看起来更像 this , this , 或 this :

static PyObject *
array_reshape(PyArrayObject *self, PyObject *args, PyObject *kwds)
{
static char *keywords[] = {"order", NULL};
PyArray_Dims newshape;
PyObject *ret;
NPY_ORDER order = NPY_CORDER;
Py_ssize_t n = PyTuple_Size(args);

if (!NpyArg_ParseKeywords(kwds, "|O&", keywords,
PyArray_OrderConverter, &order)) {
return NULL;
}

if (n <= 1) {
if (n != 0 && PyTuple_GET_ITEM(args, 0) == Py_None) {
return PyArray_View(self, NULL, NULL);
}
if (!PyArg_ParseTuple(args, "O&:reshape", PyArray_IntpConverter,
&newshape)) {
return NULL;
}
}
else {
if (!PyArray_IntpConverter(args, &newshape)) {
if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"invalid shape");
}
goto fail;
}
}
ret = PyArray_Newshape(self, &newshape, order);
npy_free_cache_dim_obj(newshape);
return ret;

fail:
npy_free_cache_dim_obj(newshape);
return NULL;
}

与此相反:

import reshape

class array:

def __init__(self,my_array):
self.my_array = my_array

def reshape(self):
self.my_array = reshape(self.my_array)

关于python - NumPy 的 free-function-reshape() 与 member-function-reshape() 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com