我正在学习 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 文档,属性
与 方法
之间有什么不同? arributes
将返回一些内容以及 methods
。
最佳答案
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
仅适用于统一数据类型的结构化数组/缓冲区,并对数组的扁平(一维)版本进行操作。
属性
通常会告诉您数组的底层数据类型、形状、维数、内存布局/步长和数据所有权,例如:
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')
都是属性
,而不是数组方法,换句话说,它们是属性。
关于python - 为什么我不能在 numpy 中使用 x.unique(),但是 x.sum() 或 x.mean() 可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092793/