Python numpy方法的应用

Python numpy方法的应用,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,我对numpy方法如何应用于nd数组感到困惑。例如: import numpy as np a = np.array([[1,2,2],[5,2,3]]) b = a.transpose() a.sort() 这里,transpose()方法没有将任何内容更改为,而是返回a的转置版本,而sort()方法对a进行排序并返回非类型。有人知道为什么会这样,以及这种不同功能的目的是什么吗?因为numpy作者决定有些方法会到位,有些则不会。为什么?我不知道除了他们之外是否有人能回答这个问题 “就

我对numpy方法如何应用于nd数组感到困惑。例如:

import numpy as np    
a = np.array([[1,2,2],[5,2,3]])
b = a.transpose()
a.sort()

这里,transpose()方法没有将任何内容更改为,而是返回a的转置版本,而sort()方法对a进行排序并返回非类型。有人知道为什么会这样,以及这种不同功能的目的是什么吗?

因为
numpy
作者决定有些方法会到位,有些则不会。为什么?我不知道除了他们之外是否有人能回答这个问题

“就地”操作可能会更快,尤其是在处理大型阵列时,因为不需要重新分配和复制整个阵列,请参阅此问题的答案

顺便说一句,大多数(如果不是全部的话)arr方法都有一个返回新数组的静态版本。例如,
arr.sort
有一个静态版本,它将接受一个数组并返回一个新的排序数组(很像全局
sorted
函数和
list.sort()
)。

在Python类(OOP)中,就地操作的方法(修改
self
或其属性)是可以接受的,如果有的话,比返回新对象的对象更常见。对于像
dict
list
这样的内置类也是如此

例如,在
numpy
中,我们通常建议使用
list append
方法来构建新阵列:

In [296]: alist = []
In [297]: for i in range(3):
     ...:     alist.append(i)
     ...:     
In [298]: alist
Out[298]: [0, 1, 2]
这很常见,我们可以很容易地将其写成一个列表:

In [299]: [i for i in range(3)]
Out[299]: [0, 1, 2]
alist.sort
操作到位,
sorted(alist)
返回一个新列表

numpy
中,返回新数组的方法更为常见。事实上,
sort
是我能马上想到的唯一的就地方法。这是对
shape
的直接修改:
arr.shape=(…)

许多基本numpy操作返回一个
视图
。与源共享数据内存,但数组对象包装器是新的。事实上,甚至索引一个元素也会返回一个新对象

因此,尽管您最终需要检查文档,但通常可以安全地假设numpy函数或方法返回一个新对象,而不是就地操作

通常,用户会被与方法同名的numpy函数弄糊涂。在大多数情况下,函数确保参数是数组,然后将操作委托给其方法。还请记住,在Python中,运算符被转换为方法调用-
+
\uuu添加
[index]
\uu getitem\uuu()
等。
+=
是一种就地操作