副本和视图
在操作数组时,它们的数据有时会被复制到一个新的数组中,有时则不会。对于初学者来说,这常常是一个困惑的来源。有三种情况:
完全没有副本
简单的赋值不复制对象或它们的数据。
>>> a = np.array([[ 0, 1, 2, 3],
... [ 4, 5, 6, 7],
... [ 8, 9, 10, 11]])
>>> b = a # no new object is created
>>> b is a # a and b are two names for the same ndarray object
True
Python将可变对象作为引用传递,因此函数调用不进行复制。
>>> def f(x):
... print(id(x))
...
>>> id(a) # id is a unique identifier of an object
148293216 # may vary
>>> f(a)
148293216 # may vary
视图或浅拷贝
不同的数组对象可以共享相同的数据。该方法创建一个新的数组对象,该对象将查看相同的data.view
>>> c = a.view()
>>> c is a
False
>>> c.base is a # c is a view of the data owned by a
True
>>> c.flags.owndata
False
>>>
>>> c = c.reshape((2, 6)) # a's shape doesn't change
>>> a.shape
(3, 4)
>>> c[0, 4] = 1234 # a's data changes
>>> a
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
对数组进行切片将返回数组的视图
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:, 1:3]"
>>> s[:] = 10 # s[:] is a view of s. Note the difference between s = 10 and s[:] = 10
>>> a
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
深拷贝
该方法生成数组及其数据的完整副本data.copy
>>> d = a.copy() # a new array object with new data is created
>>> d is a
False
>>> d.base is a # d doesn't share anything with a
False
>>> d[0,0] = 9999
>>> a
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
如果不再需要原始数组,有时应该在切片后调用。例如,假设是一个巨大的中间结果,而最终结果只包含一小部分,在使用切片构造时应该做一个深度复制。
>>> a = np.arange(int(1e8))
>>> b = a[:100].copy()
>>> del a # the memory of ``a`` can be released.
函数和方法概述
下面是按类别排序的一些有用的NumPy函数和方法名称的列表。参见完整列表。
数组创建arange
, array
, copy
, empty
, empty_like
, eye
, fromfile
, fromfunction
, identity
, linspace
, logspace
, mgrid
, ogrid
, ones
, ones_like
, r_
, zeros
, zeros_like
转换
ndarray.astype
, atleast_1d
, atleast_2d
, atleast_3d
, mat
处理
array_split
, column_stack
, concatenate
, diagonal
, dsplit
, dstack
, hsplit
, hstack
, ndarray.item
, newaxis
, ravel
, repeat
, reshape
, resize
, squeeze
, swapaxes
, take
, transpose
, vsplit
, vstack
问题
组合
argmax
, argmin
, argsort
, max
, min
, ptp
, searchsorted
, sort
操作
choose
, compress
, cumprod
, cumsum
, inner
, ndarray.fill
, imag
, prod
, put
, putmask
, real
, sum
基本统计
基础线性代数
cross
, dot
, outer
, linalg.svd
, vdot
推荐文章: