我学习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文件,attributes
与methods
之间的区别是什么? arributes
会返回methods
。
答案 0 :(得分:1)
unique
与sum
不同的是免费功能 仅而不是类(实例准确)方法。两者之间的区别是
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.sum
是arr
数组的一种方法。对于ndarray
已编译的代码。子类化数组可能有不同的sum
方法。
大多数类似命名的函数和方法的情况,这样的关系成立。
查看np.unique
的来源,了解不同的设计。我想到的一个区别是unique
仅适用于1d数组或使用扁平数组。它不像sum
或mean
这样的方法通用。
这些差异中的一些遵循一种模式,或者被解释,其他差异可能更多是发展历史的结果。通常,通过编写“独立”功能可以更轻松地添加新功能。函数,而不是向现有类添加方法。该方法与班级更紧密地结合在一起。
要了解更多详细信息,您必须花时间阅读开发档案。对于大约过去5年,通过搜索相应的github
存储库及其issues
可以找到大部分内容。