ndarray对象的使用方法

ndarray的基本操作

1.索引

基本索引:一维与list完全一致 多维同理

例如:
import numpy
ndarr1 = numpy.random.randint(0,10.size=5)
ndarr1[0] # 取数组中的第一个值, 以此类推
ndarr1[1]
ndarr1[-1]

高级索引:整数数组形式的索引

例如:
nd = np.random.randint(0,10,size=(5,6))
ndarray([[0, 4, 7, 5, 9, 7],
       [5, 3, 2, 9, 5, 5],
       [9, 2, 6, 2, 7, 7],
       [0, 3, 5, 4, 3, 9],
       [9, 1, 9, 7, 1, 3]])
nd[0][0]  # 普通的索引
# 整数数组索引
nd[0,0]
nd[-1,0]
nd[-1,]
# 往里一个维度 要同时 取出 0 2 4
nd[-1,[0,2,4]]
nd[-1,[4,2,0]]  # 顺序任意 可以正向取 也可以反向取 还可以随便取 而且可以重复取
nd[-1,[2,4,0]]
nd[-1,[2,4,0,0,0,0]]

2.切片

一维与列表切片完全一致 多维时同理

例如:
ndarr = np.random.randint(0,10,size=5)
ndarr
array([8, 6, 5, 3, 6])
ndarr[1:4]
ndarr[0:4]
ndarr[:4]
ndarr[:]

而且ndarray还支持用,一级一级往里找

ndarr[:2]
# 切片也是 从外往里 一级一级切
ndarr[:,0:2]
ndarr[1:3,1:4]
ndarr[1:3,1:-1]

使用两个:: 的形式 进行切片和翻转

例如:
nd = np.random.randint(0,10,size=9)
nd
array([0, 0, 4, 9, 0, 3, 8, 6, 5])
nd[1:-1:2]  # start:stop:step
nd[::-1]
nd[::-2]

3.变形

使用reshape函数,注意参数是一个tuple!

nd = np.random.randint(0,10,size=(4,5))
nd
array([[2, 5, 0, 9, 6],
       [0, 1, 3, 3, 8],
       [5, 3, 9, 7, 8],
       [6, 0, 9, 8, 8]])
nd.size
20

nd.reshape((5,4))  # 形状可以任意改变 但是size不能变化
nd.reshape((10,2))
nd.reshape((2,10))
# nd.reshape((5,5))  # 25
nd.reshape((20,1))
nd.reshape((-1,1))  # -1指的是自动计算的意思
nd.reshape((1,20))
nd.reshape((1,-1))

4.连结

np.concatenate()

连结需要注意的点:

  • 连结的参数是列表:一定要加小括号
  • 必须 维度相同 形状相符
  • 连结的方向默认是shape这个tuple的第一个值所代表的维度方向
  • 可通过axis参数改变连结的方向
# 第一个参数 以元组的形式 传入要拼接的多个ndarr
np.concatenate((nd,nd))  # 默认按照纵向拼接
# 第二个参数 axis 用来指定 拼接方向
# np.concatenate((nd,nd),axis=0)
# np.concatenate((nd,nd),axis=1)
# np.concatenate((nd,nd),axis=-1)  # -1是最里层
np.concatenate((nd,nd),axis=-2)  #

5.切分

与级联类似,三个函数完成切分工作:

  • np.split 默认是axis=0
  • np.vsplit 横向切 与axis=0相同
  • np.hsplit 纵向切 与axis=1相同
  • 返回值是一个列表
# ary, indices_or_sections, axis=0
# ary 要切分的数组
# indices_or_sections 用来指定 分成几份 或者 从哪里分
# axis 用来指定切分的方向
np.split()

6.副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象操作也会影响原数组。

可使用copy()函数创建副本,类似于python中的deepcopy

# 对于ndarray对象 凡是涉及到复制后改变 又不希望影响原数组的 都用copy (这是最保险的)
nd2 = nd.copy()  # 深层copy

ndarray的聚合操作

1.求和numpy.sum()

2. 最大最小值:numpy.max/ np.min

3. 其他聚合操作

Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements 所有元素的和
np.prod    np.nanprod    Compute product of elements 所有元素的乘积
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true

ndarray的矩阵操作

1.基本矩阵操作

1) 算术运算符:

  • 加减乘除

    ndarr = np.random.randint(0,10,size=(4,5))
    ndarr
    array([[4, 5, 8, 3, 0],
           [9, 4, 4, 1, 5],
           [9, 6, 4, 0, 1],
           [6, 1, 6, 4, 9]])
    ndarr+1 ...
    ndarr-1 ...
    ndarr*2
    array([[ 8, 10, 16,  6,  0],
           [18,  8,  8,  2, 10],
           [18, 12,  8,  0,  2],
           [12,  2, 12,  8, 18]])

2) 矩阵积np.dot()

ndarr
array([[4, 5, 8, 3, 0],
       [9, 4, 4, 1, 5],
       [9, 6, 4, 0, 1],
       [6, 1, 6, 4, 9]])
# 矩阵的点积
# A矩阵 和 B矩阵 做点积
# A矩阵是m行n列的矩阵
# B矩阵是i行j列的矩阵
# B的行数必须得等于A的列数 i要等于n
# 结果是一个 m行 j列的一个矩阵
ndarr2 = np.random.randint(0,10,size=(5,2))
ndarr2
array([[4, 4],
       [0, 9],
       [0, 8],
       [1, 5],
       [6, 2]])np.dot(ndarr,ndarr2)
array([[ 19, 140],
       [ 67, 119],
       [ 42, 124],
       [ 82, 119]])

2.广播机制

ndarray的排序

1.快速排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort(ndarray) 不改变输入
  • ndarray.sort() 本地处理,不占用空间,但改变输入

2.部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

  • 当k为正时,我们想要得到最小的k个数
  • 当k为负时,我们想要得到最大的k个数
示例:
nd = np.random.randint(0,100,size=15)
ndarr = np.random.randint(0,100,size=15)
ndarr
array([83, 57, 43, 83, 95, 73, 95,  7, 46, 26, 86, 47, 59, 45, 64])
# 10个数据库 里面分别有10000商品
# 计算销量最大的前三个
# a, kth a是要排序的数组 kth是要找最大的几个
# np.partition(ndarr,3)  # k是3 表示寻找 最小的3个
# np.partition(ndarr,5)  # 顺序可能是没有排好的 但是最前面的5个一定是最小的5个
np.partition(ndarr,-5)
np.partition(ndarr,-4)
array([46,  7, 43, 45, 59, 47, 26, 57, 64, 73, 83, 83, 95, 86, 95])

原文地址:https://www.cnblogs.com/louyifei0824/p/9918338.html

时间: 2024-10-16 10:02:46

ndarray对象的使用方法的相关文章

NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存对齐.Numpy内存结构 一.多维数组的存取 多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示,NumPy采用组元(tuple)作为数组的下标.如二维数组需要(x, y)的元组标记一个数组元素:三维数组需要(x, y, z)的元组标记一个元素. 如下图所示,a为一个6x6的二

NumPy-快速处理数据--ndarray对象--数组的创建和存取

本文摘自<用Python做科学计算>,版权归原作者所有. NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了这两个库,Python就有几乎和Matlab一样的处理数据和计算的能力了.可以直接按照书中写的下载Python(x,y),也可以单独配置各个模块.配置方法见:Numpy.SciPy.MatPlotLib在Python2.7.9下的安装与配置 一.为什么需要Numpy处理数据? 1. 标准安装的Python中用

NumPy Ndarray对象

NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型. 它描述相同类型的元素集合. 可以使用基于零的索引访问集合中的项目. ndarray中的每个元素在内存中使用相同大小的块. ndarray中的每个元素是数据类型对象的对象(称为 dtype). 从ndarray对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示. 下图显示了ndarray,数据类型对象(dtype)和数组标量类型之间的关系. ndarray类的实例可以通过后面描述的不同的数组创建例

Python —— 实例化ndarray对象

ndarray(全称The N-dimensional array)是存储着相同类型和大小的元素的多维数组.数组的维度和每个数组中的元素是由shape来决定的.数组中的元素类型是由dtype决定的.与其他python中的对象容器一样,ndarray中的内容可以由数组的下标来访问. 实例化ndarray对象:numpy.arange(int) 如: 根据arange()中填的数字实例化出ndarray数组,如果想要创建多维数组,需要再调用reshape()函数,如:                

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

JavaScript定义类与对象的一些方法

最近偶然碰到有朋友问我"hoisting"的问题.即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的.可以看看这个例子: 1 var a = 'global'; 2 (function () { 3     alert(a); 4     var a = 'local'; 5 })(); 大家第一眼看到这个例子觉得输出结果是什么?'global'?还是'local'?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的. 其实很简单,看一看JavaS

Servlet页面间对象传递的方法

Servlet页面间对象传递的方法 1.request 2.session 3.application 4.cookie 5.其他的 Servlet页面间对象传递的方法,布布扣,bubuko.com

调用Request对象的post方法把RequestBody传入进去

通过调用登录接口发送一个post请求.跟get不一样的地方就是传参数不一样,post请求需要把参数封装到RequestBody对象,调用Request对象的post方法把RequestBody传入进去.最后调用execute方法执行请求,这个方法前面get请求的时候讲过. http://bbs.guilinlife.com/thread-9125238-1-1.htmlhttp://bbs.guilinlife.com/thread-9125240-1-1.htmlhttp://bbs.guil

JavaScript 中关于Date的内置对象属性和方法的总结

Date 属性: 1.constructor    所建立对象的函数参考 2.prototype      能够为对象加入的属性和方法 方法: 1.getDay()    返回一周中的第几天(0-6) 2.getYear()    返回年份.2000年以前为2位,2000(包含)以后为4位 3.getFullYear()     返回完整的4位年份数 4.getMonth()      返回月份数(0-11) 5.getDate()       返回日(1-31) 6.getHours()