一.为啥需要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. IIS服务器多域名证书绑定443端口解决方案

    一个服务器IIS要绑定多个HTTPS站点(该方法在此之前,有进行测试其他网站域名的ssl证书,测试没有问题) 默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTT ...

  2. PHP多图片上传实例demo

    upload.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  3. Workflow笔记3——BookMark和持久化

    BookMark 我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才 ...

  4. 类型转换和类型相关函数.png

  5. 《JS实现复制内容到剪贴板功能,可兼容所有PC浏览器,不兼容手机端》

    前记:本来原生的JS是有提供一个函数来实现这个功能(window.clipboardData),但是很遗憾,这个函数仅仅支持IE和FF浏览器,所以基本用处不大.下边介绍的是一个第三方插件库(ZeroC ...

  6. Smart Tag——DevExpress WPF初探

    Smart Tag是一个设计时扩展,所有标准控件均自带这个功能,当然也包括 DevExpress WPF Controls .可以快速设置控件的值或者绑定最重要的属性.它还可以帮助你完成一些重复的工作 ...

  7. 特大喜讯,View and Data API 现在支持中文界面了

    大家经常会问到,使用View and Data API怎么做界面的本地化,来显示中文,现在好消息来了,从v1.2.19起,View and Data API开始支持多国语言界面了.你需要制定版本号为v ...

  8. Android中webView和网页的交互

     Android中webView和网页的交互 Android中webView跟网页的交互式通过JavaScript进行的.具体步骤: 1.创建JavaScript,在点击的时候调用JavaScript ...

  9. 使用mac终端生成RSA私钥和公钥文件

    89:~ zhangwenquan$ 89:~ zhangwenquan$ openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Gener ...

  10. directx12中vetex buffer、index buffer和constant buffer绑定piple line的时机

    类别 时机 函数 建Heap vetex buffer 在Draw函数中 ID3D12GraphicsCommandList::IASetVertexBuffer 否 index buffer 在Dr ...