numpy基础——ndarray对象方法
来源:互联网 发布:自我管理那个软件好 编辑:程序博客网 时间:2024/06/01 14:17
上一篇主要介绍了ndarray对象的一些基本属性以及创建ndarray对象的一些非常常用的方法。接下来主要介绍ndarray对象比较常用的对象方法。需要注意的是,以下ndarray对象方法也是numpy中的函数:all, any, 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 数组转换方法
示例:
>>> a = np.random.randint(12, size=(3,4))>>> aarray([[11, 1, 0, 11], [11, 0, 4, 6], [ 0, 1, 6, 7]])>>> a.item(7) #获取第7个元素6>>> a.item((1, 2)) #获取元组对应的元素4>>> a.itemset(7, 111) #设置元素>>> aarray([[ 11, 1, 0, 11], [ 11, 0, 4, 111], [ 0, 1, 6, 7]])>>> a.itemset((1, 2), 12)>>> aarray([[ 11, 1, 0, 11], [ 11, 0, 12, 111], [ 0, 1, 6, 7]])>>> a.tolist() #返回python标准列表,[[11, 1, 0, 11], [11, 0, 4, 6], [0, 1, 6, 7]]>>> a.tostring()'\x0b\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00'>>> b = a.copy() #深拷贝,b与a是两个无关的数组>>> b[0,0] = 10>>> barray([[10, 1, 0, 11], [11, 0, 4, 6], [ 0, 1, 6, 7]])>>> aarray([[11, 1, 0, 11], [11, 0, 4, 6], [ 0, 1, 6, 7]])>>> b.fill(9)>>> barray([[9, 9, 9, 9], [9, 9, 9, 9], [9, 9, 9, 9]])>>> a.byteswap() #元素大小端转换,a不变array([[ 792633534417207296, 72057594037927936, 0, 792633534417207296], [ 792633534417207296, 0, 864691128455135232, 7998392938210000896], [ 0, 72057594037927936, 432345564227567616, 504403158265495552]])>>> aarray([[ 11, 1, 0, 11], [ 11, 0, 12, 111], [ 0, 1, 6, 7]])>>> a.byteswap(True) #原地转换,a被修改array([[ 792633534417207296, 72057594037927936, 0, 792633534417207296], [ 792633534417207296, 0, 864691128455135232, 7998392938210000896], [ 0, 72057594037927936, 432345564227567616, 504403158265495552]])>>> aarray([[ 792633534417207296, 72057594037927936, 0, 792633534417207296], [ 792633534417207296, 0, 864691128455135232, 7998392938210000896], [ 0, 72057594037927936, 432345564227567616, 504403158265495552]])
如下几个方法:ndarray.tofile, ndarray.dump, ndarray.dumps, ndarray.astype, ndarray.view, ndarray.getfield, ndarray.setflags
,还没有用过,暂时不对其进行详细介绍,等用到了在补充。关于这些方法的详细介绍可以查阅numpy的官方文档。
2 形状操作
注意事项!!!
上述方法中,除resize
、flatten
外其他的方法返回的都是原数组修改shape或者axes之后的视图,也就是说,对返回数组中的元素进行修改,原数组中对应的元素也会被修改(因为它们是公用同一个数据域的)。同时,resize
方法会修改原数组的shape属性,其他方法不会修改原数组任何内部数据。
示例:
>>> x = np.arange(0,12)>>> xarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> x_reshape = x.reshape((3,4))>>> x_reshapearray([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>> x_reshape[0,0] = 10 #修改返回数组的元素,直接影响原数组中的元素值(数据域是相同的)>>> xarray([10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> x[0,0] = 0 >>> x.resize((3,4)) #resize没有返回值,会直接修改数组的shape,如下所示>>> xarray([[10, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>> x_transpose = x.transpose() #对于二维数组,返回数组的转置>>> x_transposearray([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])>>> x.resize(2,2,3)>>> xarray([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])>>> x.swapaxes(0,2) #本质上还是修改strides以及shapearray([[[ 0, 6], [ 3, 9]], [[ 1, 7], [ 4, 10]], [[ 2, 8], [ 5, 11]]])>>> x.swapaxes(0,2).strides #互换strides中第0、2位置上的数值(8, 24, 48)>>> x.strides(48, 24, 8)>>> xarray([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])>>> y = x.flatten() #返回一个全新的数组>>> yarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> y[0] = 100>>> yarray([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> x #修改y中元素的值,不影响x中的元素array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])>>> x_ravel = x.ravel() #与flatten类似,但是返回的是原数组的视图,数据域是相同的>>> x_ravelarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> x.resize((1,2,2,3,1))>>> xarray([[[[[ 0], [ 1], [ 2]], [[ 3], [ 4], [ 5]]], [[[ 6], [ 7], [ 8]], [[ 9], [10], [11]]]]])>>> x.squeeze() #移除shape中值为1的项array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])>>> x.shape(1, 2, 2, 3, 1)>>> x.squeeze().shape(2, 2, 3)
tips: transpose
1. transpose
的本质是按照参数axes
修改了strides
以及shape
属性(自己的理解):
1)提供axes,按照axes中提供的各个轴的新位置调整strides
属性中对应位置上的值
2)不提供axes,取原strides
的对称形式作为返回数组的strides
属性
3)shape
属性也是按照上述方式修改
示例:
>>> x #先看二维的情形array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>> x.transpose() #不提供axes,等同于x.transpose((1, 0))array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])>>> x.strides(32, 8)>>> x.transpose().strides(8, 32)>>> x.transpose((0,1)) #提供axes,各个轴的位置没有变化,结果与x是一样的array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>> x.transpose((0,1)).strides #strides参数也没有变化(32, 8)>>> y #再看三维的情形array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])>>> y.transpose() #不带axes参数,等同于y.transpose((2,1,0))array([[[ 0, 6], [ 3, 9]], [[ 1, 7], [ 4, 10]], [[ 2, 8], [ 5, 11]]])>>> y.transpose().strides(8, 24, 48)>>> y.strides(48, 24, 8)>>> y.transpose((2,0,1)) #带axes参数array([[[ 0, 3], [ 6, 9]], [[ 1, 4], [ 7, 10]], [[ 2, 5], [ 8, 11]]])>>> y.transpose((2,0,1)).strides #注意strides各个参数的位置与原来strides参数的位置,正好是转置时axes的对应位置(8, 48, 24)
- 不提供axes参数时,转换前后shape、strides以及数据有如下关系:
1)转置前a.shape=(i[0], i[1], ..., i[n-2], i[n-1])
,转置后的:a.transpose().shape=(i[n-1], i[n-2], ..., i[1], i[0])
2)转置前`a.strides=(j[0], j[1], ..., j[n-2], j[n-1])
,转置后:a.transpose().strides=(j[n-1], j[n-2], ..., j[1], j[0])
3)数据:a[i[0], i[1], ..., i[n-2], i[n-1]] == a.transpose()[i[n-1], i[n-2], ..., i[1], i[0]]
- 思考提供axes参数时,上述关系是怎样的?
3 计算
关于ndarray对象的很多计算方法都有一个axis
参数,它有如下作用:
1. 当axis=None
(默认)时,数组被当成一个一维数组,对数组的计算操作是对整个数组进行的,比如sum
方法,就是求数组中所有元素的和;
2. 当axis
被指定为一个int整数时,对数组的计算操作是以提供的axis
轴进行的。
示例:
>>> aarray([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])>>> a.sum(0) #等价于a[0,:,:] + a[1,:,:]array([[12, 14, 16, 18], [20, 22, 24, 26], [28, 30, 32, 34]])>>> a.sum(1) #等价于a[:,0,:] + a[:,1,:] + a[:,2,:]array([[12, 15, 18, 21], [48, 51, 54, 57]])>>> a.sum(2) #等价于a[:,:,0]+a[:,:,1]+a[:,:,2]+a[:,:,3]array([[ 6, 22, 38], [54, 70, 86]])
>>> aarray([[2, 3, 4, 9], [8, 7, 6, 5], [4, 3, 5, 8]])>>> a.max()9>>> a.max(axis=0) #shape=(4,),即原shape去掉第0个axisarray([8, 7, 6, 9])>>> a.max(axis=1) #shape=(3,),即原shape去掉第1个axisarray([9, 8, 8])>>> a.argmax()3>>> a.argmax(axis=0)array([1, 1, 1, 0])>>> a.argmax(axis=1)array([3, 0, 3])>>> b = a.flatten()>>> barray([2, 3, 4, 9, 8, 7, 6, 5, 4, 3, 5, 8])>>> b.clip(3, 5) #数组元素限定在[3, 5]之间array([3, 3, 4, 5, 5, 5, 5, 5, 4, 3, 5, 5])>>> a.resize((2,2,3))>>> aarray([[[2, 3, 4], [9, 8, 7]], [[6, 5, 4], [3, 5, 8]]])>>> a.trace(0,axis=0, axis=1) #等同于[trace(a[:,:,0]), trace(a[:,:,1], trace(a[:,:,2])];shape=(3,),即原shape去掉第0,1个axisarray([ 5, 8, 12])>>> np.eye(3).trace() #对角线元素的和3.0>>> b.reshape((3,4))array([[2, 3, 4, 9], [8, 7, 6, 5], [4, 3, 5, 8]])>>> b.reshape((3,4)).std(0)array([ 2.49443826, 1.88561808, 0.81649658, 1.69967317])>>> b.reshape((3,4)).std(1)array([ 2.6925824 , 1.11803399, 1.87082869])>>> x = np.arange(8) >>> xarray([0, 1, 2, 3, 4, 5, 6, 7])>>> x.cumsum() #累计和array([ 0, 1, 3, 6, 10, 15, 21, 28])>>> x = np.arange(1,9)>>> xarray([1, 2, 3, 4, 5, 6, 7, 8])>>> x.cumprod() #累计积array([ 1, 2, 6, 24, 120, 720, 5040, 40320])
4 选择元素以及操作
>>> aarray([2, 3, 4, 9, 8, 7, 6, 5, 4, 3, 5, 8])>>> a.take([0,3,6])array([2, 9, 6])>>> a.take([[2, 5], [3,6]]) #返回数组的形状与indices形状相同array([[4, 7], [9, 6]])>>> a.put([0, -1], [0, 111])>>> aarray([ 0, 3, 4, 9, 8, 7, 6, 5, 4, 3, 5, 111])>>> a.sort() #原地排序>>> aarray([ 0, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 111])>>> barray([ 0, 3, 4, 9, 8, 7, 6, 5, 4, 3, 5, 111])>>> b_idx = b.argsort() #获取排序索引>>> b_idxarray([ 0, 1, 9, 2, 8, 7, 10, 6, 5, 4, 3, 11])>>> b[b_idx] #根据排序索引获取b中元素,正好是排序好的array([ 0, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 111])>>> carray([ 0, 3, 4, 9, 8, 7, 6, 5, 4, 3, 5, 111])>>> c.partition(5)>>> carray([ 3, 4, 4, 0, 3, 5, 6, 5, 7, 8, 9, 111])>>> aarray([ 0, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 111])>>> a.searchsorted(2)1>>> a.searchsorted(10)11>>> a.searchsorted(3) #side默认为lift1>>> a.searchsorted(3, side="right") 3>>> e = np.eye(4)>>> earray([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]])>>> e.nonzero()(array([0, 1, 2, 3]), array([0, 1, 2, 3]))>>> e[e.nonzero()]array([ 1., 1., 1., 1.])>>> a = np.arange(4).reshape(2,2)>>> aarray([[0, 1], [2, 3]])>>> a.diagonal() #二维数组取对角线元素array([0, 3])>>> a = np.arange(8).reshape(2,2,2)>>> aarray([[[0, 1], [2, 3]], [[4, 5], [6, 7]]])>>> a.diagonal(offset=0, axis1=0, axis2=1) #三维数组根据指定axis取对角线,本质是取下面两个二维数组的对角线array([[0, 6], [1, 7]])>>> a[:,:,0] #对角线[0, 6]array([[0, 2], [4, 6]])>>> a[:,:,1] #对角线[1, 7]array([[1, 3], [5, 7]])>>> a.diagonal(offset=0, axis1=0, axis2=2)array([[0, 5], [2, 7]])>>> a[:,0,:]array([[0, 1], [4, 5]])>>> a[:,1,:]array([[2, 3], [6, 7]])>>> a.diagonal(offset=0, axis1=1, axis2=2) array([[0, 3], [4, 7]])>>> a[0,:,:]array([[0, 1], [2, 3]])>>> a[1,:,:]array([[4, 5], [6, 7]])
- numpy基础——ndarray对象方法
- numpy基础——ndarray对象属性
- numpy基础学习-ndarray对象
- numpy基础——ndarray.shape
- NumPy基础 -- 1. ndarray (多维数组对象)
- Numpy——ndarray对象(1):创建数组
- NumPy的ndArray——多维数组对象
- numpy基础——关于 ndarray 的一些尝试
- numpy中的ndarray对象
- numpy ndarray 数组对象
- numpy-数组对象ndarray
- Numpy-ndarray对象
- numpy中的ndarray对象
- NumPy基础--ndarray
- python:NumPy基础(1),ndarray多维数组对象
- numpy数组 ndarray对象基本知识
- Numpy——ndarray对象(2):数组存取和多维数组
- Python基础——numpy.ndarray一维数组与多维数组
- jquery 自定义方法名
- 增删查改——IT界的油盐酱醋
- 快速幂
- 电路基础知识 -- 虚短和虚断
- Java工程师成神之路~
- numpy基础——ndarray对象方法
- spring框架的入门学习
- 调试bug有奇招,15年的老司机 Bug 调试经验总结
- 对不正确的楼层进行排序
- 开源项目大全
- 代码分析
- nexux3.0 maven私服搭建配置
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- SAP关于金税的接口