第四节.数组方法
一个ndarray对象有许多以某种方式在数组上操作的方法,通常返回一个数组结果。 下面简要介绍这些方法。 (每个方法的文档字符串都有更完整的描述。)
对于下面的方法,在numpy中也有对应的函数:all,argmax,argmin,argpartition,argsort,choose,clip,compress,copy,cumprod,cumsum,diagonal,imag,max,mean,min,nonzero,partition, prod,ptp,put,ravel,real,repeat,reshape,round,searchsorted,sort,squeeze,std,sum,swapaxes,take,trace,transpose,var。
1.数组转换
ndarray.item (*args) |
将数组的元素复制到标准Python标量并返回 |
---|---|
ndarray.tolist () |
将数组作为(可能嵌套的)列表返回。 |
ndarray.itemset (*args) |
将标量插入数组(如果可能的话,将标量转换为数组的dtype) |
ndarray.tostring ([order]) |
构造包含数组中原始数据字节的Python字节。 |
ndarray.tobytes ([order]) |
构造包含数组中原始数据字节的Python字节。 |
ndarray.tofile (fid[, sep, format]) |
以文本或二进制形式将数组写入文件(默认)。 |
ndarray.dump (file) |
将数组的pickle转储到指定的文件。 |
ndarray.dumps () |
以字符串形式返回数组的pickle。 |
ndarray.astype (dtype[, order, casting, ...]) |
拷贝数组,转换为指定的类型。 |
ndarray.byteswap ([inplace]) |
交换数组元素的字节 |
ndarray.copy ([order]) |
返回数组的一个副本。 |
ndarray.view ([dtype, type]) |
具有相同数据的数组的新视图。 |
ndarray.getfield (dtype[, offset]) |
以给定类型返回给定数组的字段。 |
ndarray.setflags ([write, align, uic]) |
设置数组标志WRITEABLE,ALIGNED,(WRITEBACKIFCOPY和UPDATEIFCOPY),分别。 |
ndarray.fill (value) |
用标量值填充数组。 |
2.类型操作
为了重塑,调整大小和转置,单个元组参数可以被替换为将被解释为n元组的整数。
ndarray.reshape (shape[, order]) |
返回包含具有新形状的相同数据的数组。 |
---|---|
ndarray.resize (new_shape[, refcheck]) |
改变阵列的形状和大小。 |
ndarray.transpose (*axes) |
返回转轴的阵列视图。 |
ndarray.swapaxes (axis1, axis2) |
返回数组with_axis1_and_axis2_interchanged的视图。 |
ndarray.flatten ([order]) |
将数组的副本返回到一个维度。 |
ndarray.ravel ([order]) |
返回一个扁平的数组。 |
ndarray.squeeze ([axis]) |
从a的形状中移除一维条目。 |
3.Item选择和操作
对于采用一个axis关键字的数组方法,它默认为无。 如果axis是None,则该数组被视为一维数组。 任何其他价值对于axis代表操作应该进行的维度操作。
ndarray.take (indices[, axis, out, mode]) |
返回由给定索引的_a_at元素组成的数组。 |
---|---|
ndarray.put (indices, values[, mode]) |
set_n.flat [n] =全部n_in索引的值[n]。 |
ndarray.repeat (repeats[, axis]) |
数组的重复元素。 |
ndarray.choose (choices[, out, mode]) |
使用索引数组来从一组选项构造一个新的数组。 |
ndarray.sort ([axis, kind, order]) |
本地数组排序. |
ndarray.argsort ([axis, kind, order]) |
返回将对此数组进行排序的索引。 |
ndarray.partition (kth[, axis, kind, order]) |
以这样的方式重新排列数组中的元素,使得第k个元素的值位于排序数组中的位置。 |
ndarray.argpartition (kth[, axis, kind, order]) |
返回将分配此数组的索引。 |
ndarray.searchsorted (v[, side, sorter]) |
在维护顺序中查找要插入v的元素的索引。 |
ndarray.nonzero () |
返回非零元素的索引。 |
ndarray.compress (condition[, axis, out]) |
沿着给定的轴返回这个数组的切片。 |
ndarray.diagonal ([offset, axis1, axis2]) |
返回指定的对角线。 |
4.计算
这些方法中的很多都有一个名为axis的参数。 在这种情况下,
- 如果axis是None(缺省值),则该数组被视为一维数组,并且该操作在整个数组上执行。 如果self是0维数组或标量,此行为也是默认值。(数组标量是类型/类float32,float64等的一个实例,而0维数组是一个包含恰好一个数组标量的ndarray实例。
- 如果axis是一个整数,那么在给定的轴上完成操作(对于可以沿给定轴创建的每个1-D子阵列)。
axis参数的例子
尺寸为3 x 3 x 3的A3维数组,在三个轴中的每一个轴上求和
>>> x
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>>x.sum(axis=0)
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
>>># for sum, axis is the first keyword, so we may omit it,
>>># specifying only its value
>>>x.sum(0),x.sum(1),x.sum(2)
(array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]]),
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]]),
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]]))
参数dtype指定了减少操作(如求和)应该发生的数据类型。 默认的reduce数据类型与self的数据类型相同。 为了避免溢出,使用更大的数据类型来执行减少可能是有用的。
对于几种方法,还可以提供一个可选的out参数,并将结果放入给定的输出数组中。 出来的论据必须是一个ndarray并且有相同数量的元素。 在这种情况下,可以执行不同的数据类型。
ndarray.argmax ([axis, out]) |
返回沿给定轴的最大值的索引。 |
---|---|
ndarray.min ([axis, out, keepdims]) |
沿给定的轴返回最小值。 |
ndarray.argmin ([axis, out]) |
返回沿给定轴a的最小值的索引。 |
ndarray.ptp ([axis, out]) |
沿给定轴的峰到峰(最大值 - 最小值)值。 |
ndarray.clip ([min, max, out]) |
返回数值限制为[min,max]的数组。 |
ndarray.conj () |
复合共轭所有元素。 |
ndarray.round ([decimals, out]) |
每个元素的Return_a_四舍五入到给定的小数位数。 |
ndarray.trace ([offset, axis1, axis2, dtype, out]) |
返回数组的对角线的和。 |
ndarray.sum ([axis, dtype, out, keepdims]) |
返回给定轴上的数组元素的总和。 |
ndarray.cumsum ([axis, dtype, out]) |
返回给定轴上元素的累积和。 |
ndarray.mean ([axis, dtype, out, keepdims]) |
返回给定轴的数组元素的平均值。 |
ndarray.var ([axis, dtype, out, ddof, keepdims]) |
沿给定轴返回数组元素的方差。 |
ndarray.std ([axis, dtype, out, ddof, keepdims]) |
返回给定轴上的数组元素的标准偏差。 |
ndarray.prod ([axis, dtype, out, keepdims]) |
返回给定轴上的数组元素的乘积 |
ndarray.cumprod ([axis, dtype, out]) |
返回给定轴上元素的累积积。 |
ndarray.all ([axis, out, keepdims]) |
如果所有元素评估为True,则返回True。 |
ndarray.any ([axis, out, keepdims]) |
如果_a_evaluate为True的任何元素,则返回True。 |
5.算术,矩阵乘法和比较操作
ndarrays上的算术和比较操作被定义为元素操作,并且通常将ndarray对象作为结果。
每个算术运算(+, - ,*,/,//,%,divmod(),**或pow(),<<,>>,&,^,|,〜)和比较(== ,<,>,<=,> =,!=)等同于NumPy中相应的通用函数(或简称ufunc)。 有关更多信息,请参阅通用功能部分。
比较操作符:
ndarray.__lt__ |
x.__lt__(y) <==> x<y |
---|---|
ndarray.__le__ |
x.__le__(y) <==> x<=y |
ndarray.__gt__ |
x.__gt__(y) <==> x>y |
ndarray.__ge__ |
x.__ge__(y) <==> x>=y |
ndarray.__eq__ |
x.__eq__(y) <==> x==y |
ndarray.__ne__ |
x.__ne__(y) <==> x!=y |
数组的真值(bool ):
ndarray.__nonzero__ |
x.__nonzero__() <==> x != 0 |
---|---|
注意数组的真值检验调用ndarray .__ nonzero__,如果数组中的元素个数大于1,则会引发错误,因为这样的数组的真值是不明确的。 使用.any()和.all()来清楚在这种情况下是什么意思。 (如果元素个数为0,则数组的计算结果为False。)
一元操作:
ndarray.__neg__ |
x.__neg__() <==> -x |
---|---|
ndarray.__pos__ |
x.__pos__() <==> +x |
ndarray.__abs__ () <==> abs(x) |
|
ndarray.__invert__ |
x.__invert__() <==> ~x |
算术方法:
ndarray.__add__ |
x.__add__(y) <==> x+y | |
---|---|---|
ndarray.__sub__ |
x.__sub__(y) <==> x-y | |
ndarray.__mul__ |
x.__mul__(y) <==> x*y | |
ndarray.__div__ |
x.__div__(y) <==> x/y | |
ndarray.__truediv__ |
x.__truediv__(y) <==> x/y | |
ndarray.__floordiv__ |
x.__floordiv__(y) <==> x//y | |
ndarray.__mod__ |
x.__mod__(y) <==> x%y | |
ndarray.__divmod__ (y) <==> divmod(x, y) |
||
ndarray.__pow__ (y[, z]) <==> pow(x, y[, z]) |
||
ndarray.__lshift__ |
x.__lshift__(y) <==> x<<y | |
ndarray.__rshift__ |
x.__rshift__(y) <==> x>>y | |
ndarray.__and__ |
x.__and__(y) <==> x&y | |
ndarray.__or__ |
x.__or__(y) <==> x\ | y |
ndarray.__xor__ |
x.__xor__(y) <==> x^y |
注意
- pow的任何第三个参数默默地被忽略,因为底层的ufunc只有两个参数。
- 三个除法操作都是定义的; div在默认情况下处于激活状态当__future__除法生效时,truediv处于激活状态。
- 由于ndarray是内置类型(用C语言编写),因此不直接定义__r {op} __特殊方法。
- 被调用来为数组实现许多算术特殊方法的函数可以使用set_numeric_ops来修改。
算术,就地:
ndarray.__iadd__ |
x.__iadd__(y) <==> x+=y | |
---|---|---|
ndarray.__isub__ |
x.__isub__(y) <==> x-=y | |
ndarray.__imul__ |
x.__imul__(y) <==> x*=y | |
ndarray.__idiv__ |
x.__idiv__(y) <==> x/=y | |
ndarray.__itruediv__ |
x.__itruediv__(y) <==> x/y | |
ndarray.__ifloordiv__ |
x.__ifloordiv__(y) <==> x//y | |
ndarray.__imod__ |
x.__imod__(y) <==> x%=y | |
ndarray.__ipow__ |
x.__ipow__(y) <==> x**=y | |
ndarray.__ilshift__ |
x.__ilshift__(y) <==> x<<=y | |
ndarray.__irshift__ |
x.__irshift__(y) <==> x>>=y | |
ndarray.__iand__ |
x.__iand__(y) <==> x&=y | |
ndarray.__ior__ |
x.__ior__(y) <==> x\ | =y |
ndarray.__ixor__ |
x.__ixor__(y) <==> x^=y |
警告
就地操作将使用由两个操作数的数据类型决定的精度来执行计算,但是会默默地向下(如果需要的话)下降结果,以使其可以回到数组中。 因此,对于混合精度计算,A {op} = B可以不同于A = A {op} B.例如,假设a = ones((3,3))。 然后,a + = 3j不同于a = a + 3j:当它们都执行相同的计算时,a + = 3将结果转换回a中,而a = a + 3j将a重新绑定到 结果。
矩阵乘法:
ndarray.__matmul__ |
|
---|---|
注意
矩阵运算符@和@ =是在PEP465之后的Python 3.5中引入的。 为了测试目的,NumPy 1.10.0已经初步实现了@。 进一步的文档可以在matmul文档中找到。