Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.r_不是一个函数。这是怎么一回事?_Python_Function_Numpy - Fatal编程技术网

Python numpy.r_不是一个函数。这是怎么一回事?

Python numpy.r_不是一个函数。这是怎么一回事?,python,function,numpy,Python,Function,Numpy,根据numpy.r上的numpy/scipy文档,它“不是函数,所以不带参数” 如果它不是一个函数,“函数”的正确术语是什么,例如numpy.r\u?它是一个类实例(也称为对象): 查看上述类的这些输出: In [1]: a = myClass() In [2]: a[3] Out[2]: 6 In [3]: a[3,4] Out[3]: (3, 4, 3, 4) 我正在调用myClass的\uuu getitem\uuu方法(通过[]括号),并且\uu getitem\uuu方法正在返回

根据
numpy.r
上的numpy/scipy文档,它“不是函数,所以不带参数”

如果它不是一个函数,“函数”的正确术语是什么,例如
numpy.r\u

它是一个类实例(也称为对象):

查看上述类的这些输出:

In [1]: a = myClass()

In [2]: a[3]
Out[2]: 6

In [3]: a[3,4]
Out[3]: (3, 4, 3, 4)
我正在调用myClass的
\uuu getitem\uuu
方法(通过
[]
括号),并且
\uu getitem\uuu
方法正在返回(在本例中,列表的内容为*2)-它不是作为函数运行的类/实例-它是被调用的
myClass
实例的
\uuu getitem\uuu
函数


最后,您会注意到,要实例化
myClass
我必须执行
a=myClass()
,而要获得
RClass
的实例,您需要使用
numpy.r\u
这是因为numpy实例化
RClass
并将其绑定到名称numpy.r\u本身。在我看来,这是相当丑陋和混乱

我认为无论出于何种目的,
r\ucode>都是一个函数,但它是由一个聪明的黑客使用不同的语法实现的。Mike已经解释了
r\uu
实际上不是一个函数,而是
RClass
的一个类实例,它实现了
\uuu getitem\uuu
,因此您可以将其用作
r\u1]
。表面上的区别是使用方括号而不是曲线括号,因此您不是在进行函数调用,而是在为对象编制索引。尽管这在技术上是正确的,但在所有方面,它的工作方式都与函数调用类似,但它允许一些普通函数不允许的额外语法

创建
r
的动机可能来自Matlab的语法,它允许以非常紧凑的方式构造数组,如
x=[1:10,15,20:10:100]
。为了在numpy中实现同样的效果,您必须执行
x=np.hstack((np.arange(1,11),15,np.arange(20110,10))
。python中不允许使用冒号创建范围,但它们确实以切片表示法的形式存在,可以索引到列表中,例如
L[3:5]
,甚至对于多维数组,也可以使用
a[2:10,20:30]
。在后台,这些索引符号被转换为对对象方法的调用,其中冒号符号被转换为对象:


r
对象“滥用”这一事实来创建一个接受切片表示法的“函数”,它还做一些额外的事情,比如将所有内容连接在一起并返回结果,这样您就可以编写
x=np.r_1;[1:11,15,20:110:10]
。文档中的“不是函数,所以不带参数”有点误导…

它实际上是
RClass
的一个实例,而不是类本身。@RobertKern您当然是对的,我已经修改了我的答案以反映这一点。你能为周围的其他人解释一下类实例和类本身之间的区别吗?当然,完成了,如果你认为需要进一步澄清,请告诉我。解释了使用
\uuuuuuu getitem\uuuuuuuu
而不是
\uuuu call\uuuuuuu
来利用
切片
表示法。从某种意义上讲,它归结为具有
\uuuuuu getitem\uuuuuuuuu
方法和
\uuu调用
方法
np.array
np.r\
[]
具有前者,函数具有后者。事实上,任何对象都可以调用,如果它有一个
\uuuuu调用\uuuuu
class myClass(object)
    def __getitem__(self,i)
        return i*2
In [1]: a = myClass()

In [2]: a[3]
Out[2]: 6

In [3]: a[3,4]
Out[3]: (3, 4, 3, 4)
In [13]: class C(object):
    ...:     def __getitem__(self, x):
    ...:         print x

In [14]: c = C()

In [15]: c[1:11, 15, 20:110:10]
(slice(1, 11, None), 15, slice(20, 110, 10))