一.为啥需要numpy

python虽然说注重优雅简洁,但它终究是需要考虑效率的.别说运行速度不是瓶颈,在科学计算中运行速度就是瓶颈.
python的列表,跟java一样,其实只是一维列表.一维列表相当于一种类型,这样对于元素的访问效率是很低的.
python中一切皆引用,每一个int对象都要用指针指一下再用int存储一下,浪费空间也浪费时间.当读取某个元素的时候需要先读取引用,再根据引用指向的内存地址来读取int值.
numpy相当于完全采用了C语言那套数组机制.

二.numpy原则

  • 一切皆一维,多维只是马甲
    多维数组的内部实现就是一维.
  • 定长,一切皆矩形,一切皆长方体.
    比如定义了一个数组a[3],则
    len(a[0])=len(a[1])=len(a[2]),各个元素不能变长
    正是因为定长这个原则,才有可能能实现"一切皆一维"这个原则.
  • 数组中元素类型相同,长度相同
    numpy中的数组都是一维数组,并且这个一维数组中每个元素的长度相同,各个元素属于同一种类型.
    numpy中的元素相当于结构体,一个结构体所占字节数是固定的,numpy是允许用户自定义结构体类型的.
  • 数组就是一块空间
    想对它作何解释就作何解释,想给它穿上什么马甲就给它穿上什么马甲.
    对于一个包含24个元素的一维数组,可以把它理解为4*6或者2*12或者3*8的二维数组,也可以把它理解为2*2*6或者3*2*4的三维数组.

三.numpy概念

  • ndarray.ndim
    数组轴的个数,在python的世界中,轴的个数被称作秩
  • ndarray.shape
    数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
  • ndarray.size
    数组元素的总个数,等于shape属性中元组元素的乘积。
  • ndarray.dtype
    一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型。
  • ndarray.itemsize
    数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).
  • ndarray.data
    包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。

一个例子

>>> from numpy  import *
>>> a = arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int32'
>>> a.itemsize
4
>>> a.size
15
>>> type(a)
numpy.ndarray
>>> b = array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
numpy.ndarray

四.创建ndarray对象

  • np.array([[1,2],[3,4]],dtype=userType)
    使用array对象来封装python的列表或者元祖或者range对象.
  • 创建一维对象
    np.linspace产生等差数列
    np.logspace产生等比数列
    np.arange产生等差数列
  • 给定维数数组创建ndarray
    np.ones全1数组
    np.zeros全0数组
    np.empty不做处理的数组,只负责开辟空间,比前面两个速度快

五.创建随机ndarray对象

随机值都是在区间[0,1)上

  • 均匀分布
    random.random(size=None)默认返回一个0~1之间的数字,可以指明维度序列来生成特定维度的随机值.
    random.randint(low,high,size)返回一个int型数组,每个元素都在low,high之间.
    np.random.rand,相当于random.random((d1,d2,d3)),只不过这个函数的参数可以是多个而不仅仅是一个元组.
  • 正态分布
    np.random.randn

六.通用函数

通用函数的作用对象是数组中的每一个元素.
通用函数通常有一个out参数,如果带上这个参数就可以避免开辟新的内存空间.

七.广播broadcast

两个不同维度的数组相加

import numpy as np

a = np.arange(5)
b = np.arange(6).reshape(-1, 1)

def rep(a, c):
   for i in range(a.ndim-1, -1, -1):
      if a.shape[i] == c.shape[i]: continue
      if a.shape[i] == 1:
         a = a.repeat(c.shape[i], axis=i)
      else:
         raise Exception("dimention not match exception")
   return a

def add(a, b):
   if a.ndim>b.ndim: a, b = b, a
   ashape = [1] * (b.ndim-a.ndim) + list(a.shape)
   a = a.reshape(ashape)
   cshape = [max(a.shape[i], b.shape[i]) for i in range(a.ndim)]
   c = np.empty(cshape)
   a = rep(a, c)
   b = rep(b, c)
   a = a.reshape(-1)
   b = b.reshape(-1)
   cc = c.reshape(-1)
   for i in range(len(cc)):
      cc[i] = a[i] + b[i]
   return c

print(add(a, b))
print(a + b)

深入理解numpy的更多相关文章

  1. 理解-NumPy

    # 理解 NumPy 在这篇文章中,我们将介绍使用NumPy的基础知识,NumPy是一个功能强大的Python库,允许更高级的数据操作和数学计算. # 什么是 NumPy? NumPy是一个功能强大的 ...

  2. 理解numpy中ndarray的内存布局和设计哲学

    目录 ndarray是什么 ndarray的设计哲学 ndarray的内存布局 为什么可以这样设计 小结 参考 博客:博客园 | CSDN | blog 本文的主要目的在于理解numpy.ndarra ...

  3. 1.理解Numpy、pandas

    之前一直做得只是采集数据,而没有再做后期对数据的处理分析工作,自己也是有意愿去往这些方向学习的,最近就在慢慢的接触. 首先简单理解一下numpy和pandas:一.NumPy:1.NumPy是高性能计 ...

  4. 理解numpy.dot()

    import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ...

  5. 理解numpy exp函数

    exp,高等数学里以自然常数e为底的指数函数 Exp:返回e的n次方,e是一个常数为2.71828 Exp 函数 返回 e(自然对数的底)的幂次方.   a = 1 print np.exp(a) a ...

  6. 理解numpy dot函数

    python代码 x = np.array([[1,3],[1,4]]) y = np.array([[2,2],[3,1]]) print np.dot(x,y) 结果 [[11 5] [14 6] ...

  7. Python之NumPy(axis=0/1/2...)的透彻理解

    https://blog.csdn.net/sky_kkk/article/details/79725646 numpy中axis取值的说明首先对numpy中axis取值进行说明:一维数组时axis= ...

  8. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  9. NumPy 学习(1): ndarrays

    Numpy 是Numerical Python的简写,用来进行高性能的科学计算以及数据分析的基础包.它是一些高级工具(pandas)的基础.它主要提供以下几个功能: (1). ndarray:计算快, ...

随机推荐

  1. Python黑帽编程 3.4 跨越VLAN

    Python黑帽编程 3.4 跨域VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理 ...

  2. Hive技术架构

    一.Hive概念 Facebook为了解决海量日志数据的分析而开发了Hive,Hive是一种用SQL语句来读写.管理存储在分布式存储设备上的大数据集的数据仓库框架. 1. 数据是存储在HDFS上的,H ...

  3. 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案

    提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...

  4. WPF入门:XAML

    XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...

  5. Android Time类 奇葩的设定

    Android 的Time.MONTH默认是0-11表示1-12月,小白表示坑爹啊,浪费多少精力啊.

  6. JAVA大数据数组排序

    对于数据排序大家肯定见过不少,选择排序或者冒泡排序等等,今天我们要做的是快速排序 + 直接插入排序来对大数据(1000万以上)进行排序,下面我们分别来看看这两种排序规则 1, 直接插入排序 (1)基本 ...

  7. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  8. Gulp自动添加版本号

    推荐使用gulp-rev + gulp-rev-collector是比较方便的方法,结果如下: "/css/style.css" => "/dist/css/sty ...

  9. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  10. iOS - 分析JSON、XML的区别和解析方式的底层是如何实现的(延伸实现原理)

    <分析JSON.XML的区别,JSON.XML解析方式的底层是如何实现的(延伸实现原理)> (一)JSON与XML的区别: (1)可读性方面:基本相同,XML的可读性比较好: (2)可扩展 ...