为什么我不能在numpy中使用x.unique(),但x.sum()或x.mean()有效吗?

时间:2017-05-21 03:12:47

标签: python numpy

我学习numpy,但是,我不明白,例如:

import numpy as np
ints = np.array([3,3,3,2,2,1,1,4,4])

ints.unique() # this won't work
np.unique(ints) # this works

但是,某些功能可以双向工作

ints.sum()
np.sum(ints)

我正在阅读numpy文件,attributesmethods之间的区别是什么? arributes会返回methods

2 个答案:

答案 0 :(得分:1)

uniquesum不同的是免费功能 而不是类(实例准确)方法。两者之间的区别是

obj.foo()   # instance method, obj is implicitly passed to foo()
foo(obj)    # free function,   obj is explicity passed to foo()

查看here以获取有关不同方法变体的一些解释。在NumPy中,这主要是一个设计决策,我相信,但是某些功能成为自由功能有某些原因。想到的一个原因是,与其他技术语言(例如MATLAB)不同,numpy数组可以是结构化的或非结构化的,并且在包含不同类型的对象方面可以是灵活的,例如

a = np.array([[1,2],[3,4]])        # structured array
b = np.array([[1,2],[3,4,5]])      # unstructured array
c = np.array([[1,2],["abc",True]]) # unstructured array with flexible data type

在这种情况下,必须使每个函数/方法成为实例方法,会导致混乱的行为。甚至sum函数对结构化和非结构化数组的行为也不同

In [18]: a.sum() # sums all elements of the array
Out[18]: 10
In [19]: b.sum() # concatenates all elements of the array
Out[19]: [1, 2, 3, 4, 5]

相比之下,像unique这样的函数在应用程序方面的范围要窄得多。例如,unique仅适用于统一数据类型的结构化数组/缓冲区,并且在数组的展平(一维)版本上运行。

attributes numpy数组通常会告诉您数组的基础数据类型,形状,维度,内存布局/步幅和数据所有权,例如:

In [20]: a=np.random.rand(3,4)
In [21]: a.flags
Out[21]: 
    C_CONTIGUOUS : True
    F_CONTIGUOUS : False
    OWNDATA : True
    WRITEABLE : True
    ALIGNED : True
    UPDATEIFCOPY : False

In [22]: a.shape
Out[22]: (3, 4)

In [23]: a.dtype
Out[23]: dtype('float64')

都是attributes而不是每个说法的数组方法,换句话说它们是属性。

答案 1 :(得分:1)

np.sum是一个函数,它接受一个数组或任何可以转换为数组的东西,然后应用它的sum方法。有关详细信息,请参阅np.source(np.sum)

arr.sumarr数组的一种方法。对于ndarray已编译的代码。子类化数组可能有不同的sum方法。

大多数类似命名的函数和方法的情况,这样的关系成立。

查看np.unique的来源,了解不同的设计。我想到的一个区别是unique仅适用于1d数组或使用扁平数组。它不像summean这样的方法通用。

这些差异中的一些遵循一种模式,或者被解释,其他差异可能更多是发展历史的结果。通常,通过编写“独立”功能可以更轻松地添加新功能。函数,而不是向现有类添加方法。该方法与班级更紧密地结合在一起。

要了解更多详细信息,您必须花时间阅读开发档案。对于大约过去5年,通过搜索相应的github存储库及其issues可以找到大部分内容。