ndarray即是多维数组【n dimension array】

一:创建ndarray

  有好几种创建数组的方法。

  例如,你可以使用 array 函数从常规的Python列表和元组创造数组。所创建的数组类型由原序列中的元素类型推导而来。

  >>> import numpy as np
  >>> a = np.array( [2,3,4] )
  >>> a
  array([2, 3, 4])
  >>> a.dtype
  dtype('int32')
  dtype('float64') 一个常见的错误包括用多个数值参数调用`array`而不是提供一个由数值组成的列表作为一个参数。
  >>> a = np.array(1,2,3,4) # WRONG
  >>> a = np.array([1,2,3,4]) # RIGHT

  数组将序列包含序列转化成二维的数组,序列包含序列包含序列转化成三维数组等等。

  >>> data = [ [1.5,2,3], [4,5,6] ]
  >>> b = np.array( data )
  >>> b
  array([[ 1.5, 2. , 3. ],
  [ 4. , 5. , 6. ]])

  数组类型可以在创建时显示指定

  >>> c = array( [ [1,2], [3,4] ], dtype=complex )
  >>> c
  array([[ 1.+0.j, 2.+0.j],
   [ 3.+0.j, 4.+0.j]])

  通常,数组的元素开始都是未知的,但是它的大小已知。因此,NumPy提供了一些使用占位符创建数组的函数。这最小化了扩展数组的需要和高昂的运算代价。

  函数 function 创建一个全是0的数组,函数 ones 创建一个全1的数组,函数empty 创建一个内容随机并且依赖与内存状态的数组【默认创建的数组类型(dtype)都是float64】

  >>> zeros(( 3,4))
  array([[0., 0., 0., 0.],
   [0., 0., 0., 0.],
   [0., 0., 0., 0.]])
  >>> ones( (2,3,4), dtype=int16 ) # dtype can also be specified
  array([[[ 1, 1, 1, 1],
   [ 1, 1, 1, 1],
   [ 1, 1, 1, 1]],
   [[ 1, 1, 1, 1],
   [ 1, 1, 1, 1],
   [ 1, 1, 1, 1]]], dtype=int16)
  >>> empty( (2,3) )
  array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
   [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])

  为了创建一个数列,NumPy提供一个类似arange的函数返回数组而不是列表:

  >>> arange( 10, 30, 5 )
  array([10, 15, 20, 25])
  >>> arange( 0, 2, 0.3 ) # it accepts float arguments
  array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

  当 arange 使用浮点数参数时,由于有限的浮点数精度,通常无法预测获得的元素个数。因此,最好使用函数 linspace 去接收我们想要的元素个数来代替用range来指定步长。

  其它函数array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, rand, randn, fromfunction, fromfile参考:NumPy示例

二:numpy的数据类型【dtype】

  数字,字符串,对象,unicode

  dtype命名方式:类型名 + 表示各元素位长的数字
          e.g:int 16 , float 64 ......
  查看类型:dtype方法
         arr.dtype() 
  类型转换:astype方法
       e.g:arr = np.array([1,2,3])
           float_array = arr.astype(np.float64)
       注:浮点数转为整数则会去掉小数部分
       如果某字符串数组全为数字,可将其转为数值形式
       e.g: strings = np.array(['1','2','3','4'])
          numeric_string = arr.astype(float)
 
三:数组运算
  ndarray的运算是基于元素的,也就是说并不需要编写循环就能够对每个数据元素进行处理:
  e.g:
    arr = np.array([ [1,2,3], [4,5,6] ,[7,8,9]])
    arr*2    #则每个元素都乘以2
 
四:索引和切片
  arr = np.array([[1,2,3], [4,5,6] ,[7,8,9]])
  names = np.array(['bob','john','will','bob','will','joe','joe'])
  1)切片:
    一维数组的切片和python list的一样
    二维的可以在两个方向上切
      e.g:
        arr[0:2]

        -->array([[1, 2, 3],
                 [4, 5, 6]])

        arr[0:2,1]
        -->array([2, 5])

        arr[0:2,0:2]
        -->array([[1, 2],
             [4, 5]])

        注:可以利用切片进行批量赋值[切记操作都是元素性的]

        arr[0:2,0:2] = 9
        arr

        -->array([[9, 9, 3],

                [9, 9, 6],
              [7, 8, 9]])

  2)数值索引
    和python list索引一样
    若是一个两行三列的数组arr,可以通过arr[x]访问第x行 , arr[x][y]访问第x行y列的元素
  3)布尔索引   
    names = np.array(['bob','john','will','bob','will','joe','joe'])

    names == 'bob'
    -->array([ True, False, False, True, False, False, False], dtype=bool)           #意思即是会产生一个布尔型的array数组

    data = np.random.randn(5,4)

    data
    -->array([[-0.00343354, 0.50658368, 0.26039623, -1.17846766],
        [ 0.10990542, 0.52022534, -1.10899795, -2.11391774],
        [-0.69619996, 0.25121838, -0.50346134, -0.4248276 ],
        [ 0.48882343, -1.409604 , -0.38028868, 0.4928941 ],
        [-0.03851536, -1.6177832 , 0.24822048, 0.79837076]])

    data[names == "bob"]
    -->array([[-0.00343354, 0.50658368, 0.26039623, -1.17846766],
        [ 0.48882343, -1.409604 , -0.38028868, 0.4928941 ]])

   注:还可以和切片联合使用

    date[names == "bob",2:]
    -->array([[ 0.26039623, -1.17846766],
        [-0.38028868, 0.4928941 ]])

  4)花式索引【fancy indexing】:利用整数数组进行索引

    

      arr = np.empty((8,4))

      arr
      -->array([[ 3.63521590e+228, 6.96747054e+252, 5.81241635e+180,2.30074046e-312],
           [ 3.16276242e-316, 3.24199869e-316, 3.16276242e-316,2.30320756e-316],
           [ 2.30321230e-316, 2.44349454e-316, 2.30320993e-316,3.18366574e-316],
           [ 2.30320756e-316, 2.30321942e-316, 2.30320993e-316,3.18366574e-316],
           [ 2.30320756e-316, 2.30321942e-316, 2.30320756e-316,2.44346371e-316],
           [ 3.22628503e-316, 3.22637041e-316, 3.22628266e-316,2.44349928e-316],
           [ 3.22635618e-316, 3.24213624e-316, 2.30320282e-316,3.16264621e-316],
           [ 2.30320756e-316, 3.22635618e-316, 3.22637041e-316,3.22635618e-316]])

      for i in range(8):

        arr[i] = i

      arr
      -->array([[ 0., 0., 0., 0.],
          [ 1., 1., 1., 1.],
          [ 2., 2., 2., 2.],
          [ 3., 3., 3., 3.],
          [ 4., 4., 4., 4.],
          [ 5., 5., 5., 5.],
          [ 6., 6., 6., 6.],
          [ 7., 7., 7., 7.]])

      arr[[0,3,6]]                       #!!两个【【 】】    -号表示反向

      -->array([[ 0., 0., 0., 0.],
          [ 3., 3., 3., 3.],
          [ 6., 6., 6., 6.]])

      arr[[-0,-3,-6]]
      -->array([[ 0., 0., 0., 0.],
          [ 5., 5., 5., 5.],
          [ 2., 2., 2., 2.]])

      

      arr = np.arange(32).reshape((8,4))          #reshape方法对前面的一维数组元素重新排列

      arr
      -->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, 27],
        [28, 29, 30, 31]])

      arr[[1,5,7,2],[0,3,1,2]]          #先选出行,再在对应行选出列元素
      -->array([ 4, 23, 29, 10])

  注:数组切片是原始数组的视图,也就是说数据不被复制,改动会直接反映到原数组上,与python里的切片不同!!

    布尔索引与花式索引会创建副本

    

    

五:数组转置和轴对换

六:通用函数  

  abs:绝对值

  sqr:平方根    <-------->   square:平方

  floor:取小于此数的最大整数   <----->  ceil

  tan(h),cos(h),sin(h):h表示反三角函数

  e.g:

    arr = np.arange(10)

    np.sqrt(arr)
    --->array([ 0. , 1. , 1.41421356, 1.73205081, 2. ,2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])

七:利用ndarray进行数据处理

  e.g 1:计算sqrt(x^2+y^2)    np.meshgrid()方法接收两个一维数组产生两个二维矩阵

      points = np.arange(-5,5,1)

      points
      -->array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])

      xs , ys = np.meshgrid(points,points)

      ys
      -->array([[-5, -5, -5, -5, -5, -5, -5, -5, -5, -5],
          [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4],
          [-3, -3, -3, -3, -3, -3, -3, -3, -3, -3],
          [-2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
          [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
          [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
          [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
          [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
          [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
          [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]])

      xs
      -->array([[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4],
          [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]])

      z = np.sqrt(xs**2+ys**2)

      z
      -->array([[ 7.07106781, 6.40312424, 5.83095189, 5.38516481, 5.09901951,5. , 5.09901951, 5.38516481, 5.83095189, 6.40312424],
          [ 6.40312424, 5.65685425, 5. , 4.47213595, 4.12310563,4. , 4.12310563, 4.47213595, 5. , 5.65685425],
          [ 5.83095189, 5. , 4.24264069, 3.60555128, 3.16227766,3. , 3.16227766, 3.60555128, 4.24264069, 5. ],
          [ 5.38516481, 4.47213595, 3.60555128, 2.82842712, 2.23606798,2. , 2.23606798, 2.82842712, 3.60555128, 4.47213595],
          [ 5.09901951, 4.12310563, 3.16227766, 2.23606798, 1.41421356,1. , 1.41421356, 2.23606798, 3.16227766, 4.12310563],
          [ 5. , 4. , 3. , 2. , 1. ,0. , 1. , 2. , 3. , 4. ],
          [ 5.09901951, 4.12310563, 3.16227766, 2.23606798, 1.41421356,1. , 1.41421356, 2.23606798, 3.16227766, 4.12310563],
          [ 5.38516481, 4.47213595, 3.60555128, 2.82842712, 2.23606798,2. , 2.23606798, 2.82842712, 3.60555128, 4.47213595],
          [ 5.83095189, 5. , 4.24264069, 3.60555128, 3.16227766,3. , 3.16227766, 3.60555128, 4.24264069, 5. ],
          [ 6.40312424, 5.65685425, 5. , 4.47213595, 4.12310563,4. , 4.12310563, 4.47213595, 5. , 5.65685425]])

  e.g2:逻辑运算的数组表示

    numpy.where函数 即是x if condition else的矢量化版本:
    

    arr = np.random.randn(4,4)

    arr
    -->array([[-1.51211007, 0.51280389, -0.62088368, -1.35715715],
          [ 1.13127552, -0.98699052, -0.12450559, -0.81690629],
          [ 1.08641757, 1.89675729, 0.54465751, -0.40756964],
          [-1.92890717, -0.76061215, -1.67972853, 1.94591207]])

    np.where(arr>0, 2 , arr)               #将正值转化为2

    -->array([[-1.51211007, 2. , -0.62088368, -1.35715715],
          [ 2. , -0.98699052, -0.12450559, -0.81690629],
          [ 2. , 2. , 2. , -0.40756964],
          [-1.92890717, -0.76061215, -1.67972853, 2. ]])

  e.g3:数学与统计方法:

    对整个数组或某个轴向的数据进行统计计算

    方法:sum,mean:算术平均数,std:标准差,var:方差,min,max,argmin最小值的索引,argmax,cumsum累积和,sumprod累计积

      注:以上方法几乎都可以接受一个参数0或1,0代表列对待,1代表行对待

      arr = np.array([[0,1,2],[3,4,5],[6,7,8]])

      arr.min()
      0

      arr.sum()
      36

      arr.sum(1)
      -->array([ 3, 12, 21])

      arr.sum(0)
      -->array([ 9, 12, 15])

      arr.min(1)
      -->array([0, 3, 6])

      arr.min(0)
      -->array([0, 1, 2])

  e.g4:bool型数组的方法  

    (arr>0).sum(0)#在上面的那些方法中bool型会被强制转化为1或0

    -->array([2, 3, 3])

    (arr>0).sum()
    8

  e.g5:排序

    sort方法

    arr.sort(【0或1】)

  

e.g6:唯一化,unique()函数,去掉重复函数

      np.unique(arr)

  

e.g7:集合逻辑函数

    inld(x,y):返回一个x集合的元素是否包含在y集合中的bool型数组

    unionld(x,y):计算x,y的并集并返回有序结果

    intersectld(x,y):计算x,y的交集并且返回有序结果

    setdiffld(x,y):在x但不在y中的元素

    setxorld(x,y):仅在其中一个数组存在的元素

  e.g8:随机数相关

  

      numpy.random模块提供了许多生成随机数的方式

  

      e.g:sample = np.random.normal(size=(4,4))    #即是生成一个标准正太分布的4X4数组

      还有许多其他的生成方式就不赘述了

    

参考:http://blog.csdn.net/lsjseu/article/details/20359201;这篇文章十分详尽,我开头的创建ndarray是直接copy他的
   其他关于数据处理的例子来源为《利用python进行数据分析》

2:numpy---ndarray的更多相关文章

  1. python中numpy.ndarray.shape的用法

    今天用到了shape,就顺便学习一下,这个shape的作用就是要把矩阵进行行列转换,请看下面的几个例子就明白了: >>> import numpy as np >>> ...

  2. has invalid type <class 'numpy.ndarray'>, must be a string or Tensor

    转自: https://blog.csdn.net/jacke121/article/details/78833922 has invalid type <class 'numpy.ndarra ...

  3. NumPy Ndarray 对象

    NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...

  4. numpy.random.random & numpy.ndarray.astype & numpy.arange

    今天看到这样一句代码: xb = np.random.random((nb, d)).astype('float32') #创建一个二维随机数矩阵(nb行d列) xb[:, 0] += np.aran ...

  5. Python中Numpy ndarray的使用

    本文主讲Python中Numpy数组的类型.全0全1数组的生成.随机数组.数组操作.矩阵的简单运算.矩阵的数学运算. 尽管可以用python中list嵌套来模拟矩阵,但使用Numpy库更方便. 定义数 ...

  6. Numpy ndarray 的高级索引存在 "bug" ?

    Numpy ndarray 高级索引 "bug" ? 话说一天,搞事情,代码如下 import numpy as np tmp = [1, 2, 3, 4] * 2 a, b = ...

  7. torch.Tensor和numpy.ndarray

    1. torch.Tensor和numpy.ndarray相互转换 import torch import numpy as np # <class 'numpy.ndarray'> np ...

  8. Numpy Ndarray对象1

    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指 针.这样为了保存一个简单的[1,2,3],需要有3个指针和三 ...

  9. python:<class 'numpy.ndarray'>的学习

    在学习opencv-python的时候,给出图片地址再调用cv2.imread("地址"),发现出创建的是numpy类型的ndarray对象,用来存放多维数组的对象 # 导入cv2 ...

  10. 解决Tensorflow ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)

    问题描述 在将一个数组送入tensorflow训练时,报错如下: ValueError: Failed to convert a NumPy array to a Tensor (Unsupporte ...

随机推荐

  1. 带左右箭头切换的自动滚动图片JS特效

    效果图 按钮 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  2. 如何启动Service,如何停用Service(转)

    如何启用Service,如何停用Service Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发现,可以使用它开发如监控之类的程序.服 ...

  3. 常用CSS代码片断

    单行文本截字 .nowrap { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; word-break: normal; ...

  4. 转载:执行脚本出现bin/bash: bad interpreter: No such file or directory

    转载网址:http://blog.csdn.net/red10057/article/details/8051650 刚刚学习 SHELL 写了一个简单的例子 发生如下错误 -bash: ./test ...

  5. 如何用PowerPoint制作闪烁的星星

    在PPT中,PPT动画说是幻灯片PPT中的精华是当之无愧的!ppt文件有了动画,犹如插上翅膀的鸟,让PPT的色彩衍生出了更多的特色.只要你的ppt动画效果制作的对,你的幻灯片将明显与众不同,观众也更容 ...

  6. ionic中修改图标的问题

    有两种修改图标的方法,一种是手动配置,另外一种是使用命令 1.手动配置 把图标icon.png复制到resources\android\icon目录下 修改根目录的config.xml文件 <p ...

  7. Spark 资源调度及任务调度

    1.  资源分配 通过SparkSubmit进行提交应用后,首先会创建Client将应用程序(字节码文件.class)包装成Driver,并将其注册到Master.Master收到Client的注册请 ...

  8. reg51.h 详解

    /* BYTE Register */ sfr P0 = 0x80; //P0口 sfr P1 = 0x90; //P1口 sfr P2 = 0xA0; //P2口 sfr P3 = 0xB0; // ...

  9. PL/SQL 0.几秒出结果,SQL效率一定高吗?

    今天开发问我一个问题,PL/SQL很快出结果了,为什么应用还是很慢 create index F_AGT_SAVB_ACCTINFO_H_idx4 on F_AGT_SAVB_ACCTINFO_H ( ...

  10. Java正则表达式的语法与示例

    Java正则表达式的语法与示例 java 正则表达式 正则表达式语法 java正则表达式语法 java正则表达式 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 ...