python numpy 基础教程

Numpy简介

1.Numpy是什么

非常easy。Numpy是Python的一个科学计算的库。提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。事实上,list已经提供了类似于矩阵的表示形式,只是numpy为我们提供了很多其它的函数。

假设接触过matlab、scilab。那么numpy非常好入手。

在下面的代码演示样例中。总是先导入了numpy:(通用做法import numpu as np 简单输入)

>>> import numpy as np
>>> print np.version.version
1.6.2

2. 多维数组

多维数组的类型是:numpy.ndarray。

使用numpy.array方法

以list或tuple变量为參数产生一维数组:

>>> print np.array([1,2,3,4])
[1 2 3 4]
>>> print np.array((1.2,2,3,4))
[ 1.2  2.   3.   4. ]
>>> print type(np.array((1.2,2,3,4)))
<type 'numpy.ndarray'>

以list或tuple变量为元素产生二维数组或者多维数组:

>>> x = np.array(((1,2,3),(4,5,6)))
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> y = np.array([[1,2,3],[4,5,6]])
>>> y
array([[1, 2, 3],
       [4, 5, 6]])

numpy数据类型设定与转换

numpy ndarray数据类型能够通过參数dtype 设定。并且能够使用astype转换类型。在处理文件时候这个会非常有用。注意astype 调用会返回一个新的数组,也就是原始数据的一份拷贝。

numeric_strings2 = np.array(['1.23','2.34','3.45'],dtype=np.string_)

numeric_strings2
Out[32]:
array(['1.23', '2.34', '3.45'],
      dtype='|S4')

numeric_strings2.astype(float)
Out[33]: array([ 1.23,  2.34,  3.45])

numpy索引与切片

index 和slicing :第一数值类似数组横坐标。第二个为纵坐标

>>> x[1,2]
6
>>> y=x[:,1]
>>> y
array([2, 5])

涉及改变相关问题,我们改变上面y是否会改变x?这是特别须要关注的。

>>> y
array([2, 5])
>>> y[0] = 10
>>> y
array([10,  5])
>>> x
array([[ 1, 10,  3],
       [ 4,  5,  6]])

通过上面能够发现改变y会改变x ,因而我们能够判断,y和x指向是同一块内存空间值,系统没有为y 新开辟空间把x值赋值过去。

arr = np.arange(10)

arr
Out[45]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[4]
Out[46]: 4

arr[3:6]
Out[47]: array([3, 4, 5])

arr[3:6] = 12

arr
Out[49]: array([ 0,  1,  2, 12, 12, 12,  6,  7,  8,  9])

如上所看到的:当将一个标量赋值给切片时。该值会自己主动传播整个切片区域,这个跟列表最重要本质差别,数组切片是原始数组的视图,视图上不论什么改动直接反映到源数据上面。

思考为什么这么设计? Numpy 设计是为了处理大数据,假设切片採用数据复制话会产生极大的性能和内存消耗问题。

假如说须要对数组是一份副本而不是视图能够例如以下操作:

arr_copy = arr[3:6].copy()

arr_copy[:]=24

arr_copy
Out[54]: array([24, 24, 24])

arr
Out[55]: array([ 0,  1,  2, 12, 12, 12,  6,  7,  8,  9])

再看下对list 切片改动

l=range(10)

l
Out[35]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

l[5:8] = 12
Traceback (most recent call last):

  File "<ipython-input-36-022af3ddcc9b>", line 1, in <module>
    l[5:8] = 12

TypeError: can only assign an iterable

l1= l[5:8]

l1
Out[38]: [5, 6, 7]

l1[0]=12

l1
Out[40]: [12, 6, 7]

l
Out[41]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

这里设计到python 中深浅拷贝,当中切片属于浅拷贝,详细參考:python深浅拷贝

多维数组索引、切片

arr2d = np.arange(1,10).reshape(3,3)

arr2d
Out[57]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

arr2d[2]
Out[58]: array([7, 8, 9])

arr2d[0][2]
Out[59]: 3

arr2d[0,2]
Out[60]: 3

布尔型索引

这样的类型在实际代码中出现比較多,关注下。

names = np.array(['Bob','joe','Bob','will'])

names == 'Bob'
Out[70]: array([ True, False,  True, False], dtype=bool)
data
Out[73]:
array([[ 0.36762706, -1.55668952,  0.84316735, -0.116842  ],
       [ 1.34023966,  1.12766186,  1.12507441, -0.68689309],
       [ 1.27392366, -0.43399617, -0.80444728,  1.60731881],
       [ 0.23361565,  1.38772715,  0.69129479, -1.19228023],
       [ 0.51353082,  0.17696698, -0.06753478,  0.80448168],
       [ 0.21773096,  0.60582802, -0.46446071,  0.83131122],
       [ 0.50569072,  0.04431685, -0.69358155, -0.9629124 ]])

data[data < 0] = 0

data
Out[75]:
array([[ 0.36762706,  0.        ,  0.84316735,  0.        ],
       [ 1.34023966,  1.12766186,  1.12507441,  0.        ],
       [ 1.27392366,  0.        ,  0.        ,  1.60731881],
       [ 0.23361565,  1.38772715,  0.69129479,  0.        ],
       [ 0.51353082,  0.17696698,  0.        ,  0.80448168],
       [ 0.21773096,  0.60582802,  0.        ,  0.83131122],
       [ 0.50569072,  0.04431685,  0.        ,  0.        ]])

上面展示通过布尔值来设置值的手段。

数组文件输入输出

在跑实验时常常须要用到读取文件里的数据,事实上在numpy中已经有成熟函数封装好了能够使用

将数组以二进制形式格式保存到磁盘。np.save 、np.load 函数是读写磁盘的两个主要函数。默认情况下,数组以未压缩的原始二进制格式保存在扩展名为.npy的文件里

arr = np.arange(10)
np.save('some_array',arr)
np.load('some_array.npy')
Out[80]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

存取文本文件:

文本中存放是聚类须要数据,直接能够方便读取到numpy array中,省去一行行读文件繁琐。

arr = np.loadtxt('dataMatrix.txt',delimiter=' ')

arr
Out[82]:
array([[ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ,
         0.8125    ],
       [ 0.52882353,  0.56271186,  0.48220588,  0.53384615,  0.61651376,
         0.58285714],
       [ 0.        ,  0.        ,  0.        ,  1.        ,  1.        ,
         1.        ],
       [ 1.        ,  0.92857143,  0.91857143,  1.        ,  1.        ,
         1.        ],
       [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ,
         1.        ],
       [ 0.05285714,  0.10304348,  0.068     ,  0.06512821,  0.05492308,
         0.05244898],
       [ 0.04803279,  0.08203125,  0.05516667,  0.05517241,  0.04953488,
         0.05591549],
       [ 0.04803279,  0.08203125,  0.05516667,  0.05517241,  0.04953488,
         0.05591549]])

np.savetxt 运行相反的操作。这两个函数在跑实验载入数据时能够提供非常多便利!。!

使用numpy.arange方法

>>> print np.arange(15)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
>>> print type(np.arange(15))
<type 'numpy.ndarray'>
>>> print np.arange(15).reshape(3,5)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
>>> print type(np.arange(15).reshape(3,5))
<type 'numpy.ndarray'>

使用numpy.linspace方法

比如,在从1到10中产生20个数:

>>> print np.linspace(1,10,20)
[  1.           1.47368421   1.94736842   2.42105263   2.89473684
   3.36842105   3.84210526   4.31578947   4.78947368   5.26315789
   5.73684211   6.21052632   6.68421053   7.15789474   7.63157895
   8.10526316   8.57894737   9.05263158   9.52631579  10.        ]

使用numpy.zeros,numpy.ones。numpy.eye等方法能够构造特定的矩阵

>>> print np.zeros((3,4))
[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]
>>> print np.ones((3,4))
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]
>>> print np.eye(3)
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

获取数组的属性:

>>> a = np.zeros((2,2,2))
>>> print a.ndim   #数组的维数
3
>>> print a.shape  #数组每一维的大小
(2, 2, 2)
>>> print a.size   #数组的元素数
8
>>> print a.dtype  #元素类型
float64
>>> print a.itemsize  #每一个元素所占的字节数
8

Memory layout

The following attributes contain information about the memory layout of the array:

ndarray.flags Information about the memory layout of the array.
ndarray.shape Tuple of array dimensions.
ndarray.strides Tuple of bytes to step in each dimension when traversing an array.
ndarray.ndim Number of array dimensions.
ndarray.data Python buffer object pointing to the start of the array’s data.
ndarray.size Number of elements in the array.
ndarray.itemsize Length of one array element in bytes.
ndarray.nbytes Total bytes consumed by the elements of the array.
ndarray.base Base object if memory is from some other object.

Array methods

An ndarray object
has many methods which operate on or with the array in some fashion, typically returning an array result. These methods are briefly explained below. (Each method’s docstring has a more complete description.)

For the following methods there are also corresponding functions in numpyallanyargmaxargminargpartitionargsortchooseclip,compresscopycumprodcumsumdiagonalimagmaxmeanminnonzeropartitionprodptpputravelrealrepeatreshaperound,searchsortedsortsqueezestdsumswapaxestaketracetransposevar.

很多其它Array的相关方法见:http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

用到比較多函数演示样例:

>>> x
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]]])
>>> x.sum(axis=1)
array([[ 9, 12, 15],
       [36, 39, 42],
       [63, 66, 69]])
>>> x.sum(axis=2)
array([[ 3, 12, 21],
       [30, 39, 48],
       [57, 66, 75]])
>>> np.sum([[0, 1], [0, 5]])
6
>>> np.sum([[0, 1], [0, 5]], axis=0)
array([0, 6])
>>> np.sum([[0, 1], [0, 5]], axis=1)
array([1, 5])

合并数组

使用numpy下的vstack(垂直方向)和hstack(水平方向)函数:

>>> a = np.ones((2,2))
>>> b = np.eye(2)
>>> print np.vstack((a,b))
[[ 1.  1.]
 [ 1.  1.]
 [ 1.  0.]
 [ 0.  1.]]
>>> print np.hstack((a,b))
[[ 1.  1.  1.  0.]
 [ 1.  1.  0.  1.]]

看一下这两个函数有没有涉及到浅拷贝这样的问题:

>>> c = np.hstack((a,b))
>>> print c
[[ 1.  1.  1.  0.]
 [ 1.  1.  0.  1.]]
>>> a[1,1] = 5
>>> b[1,1] = 5
>>> print c
[[ 1.  1.  1.  0.]
 [ 1.  1.  0.  1.]]

通过上面能够知道,这里进行是深拷贝。而不是引用指向同一位置的浅拷贝。

深拷贝数组

数组对象自带了浅拷贝和深拷贝的方法,可是一般用深拷贝多一些:

>>> a = np.ones((2,2))
>>> b = a
>>> b is a
True
>>> c = a.copy()  #深拷贝
>>> c is a
False

主要的矩阵运算

转置:

>>> a = np.array([[1,0],[2,3]])
>>> print a
[[1 0]
 [2 3]]
>>> print a.transpose()
[[1 2]
 [0 3]]

numpy.linalg模块中有非常多关于矩阵运算的方法:

特征值、特征向量:

>>> a = np.array([[1,0],[2,3]])

>>> nplg.eig(a)
(array([ 3.,  1.]), array([[ 0.        ,  0.70710678],
       [ 1.        , -0.70710678]]))
时间: 2024-10-10 11:46:58

python numpy 基础教程的相关文章

分享《Python数据分析基础教程:NumPy学习指南(第2版)》高清中文PDF+英文PDF+源代码

下载:https://pan.baidu.com/s/1YSD97Gd3gmmPmNkvuG0eew更多资料分享:http://blog.51cto.com/3215120 <Python数据分析基础教程:NumPy学习指南(第2版)>高清中文PDF+高清英文PDF+源代码 高清中文版PDF,249页,带目录和书签,文字能够复制粘贴:高清英文版PDF,310页,带目录和书签,文字能够复制粘贴:中英文两版可以对比学习.配套源代码:经典书籍,讲解详细:其中高清中文版如图: 原文地址:http://

Numpy学习:《Python数据分析基础教程NumPy学习指南第2版》中文PDF+英文PDF+代码

NumPy是一个优秀的科学计算库,提供了很多实用的数学函数.强大的多维数组对象和优异的计算性能,不仅可以取代Matlab和Mathematica的许多功能,而且业已成为Python科学计算生态系统的重要组成部分.但与这些商业产品不同,它是免费的开源软件. 推荐学习<Python数据分析基础教程NumPy学习指南第2版>,通过书中丰富的示例,学会Matplotlib绘图,并结合使用其他Python科学计算库(如SciPy和Scikits),让工作更有成效,让代码更加简洁而高效. 学习参考: &l

《Python机器学习基础教程》高清版免费PDF下载

Python机器学习基础教程-[德] 安德里亚斯·穆勒(Andreas C.Müller)[美]莎拉·吉多(Sarah Guido) 著,张亮(hysic) 译 下载地址1:网盘下载 下载地址2:网盘下载 内容简介本书是机器学习入门书,以Python语言介绍.主要内容包括:机器学习的基本概念及其应用:实践中常用的机器学习算法以及这些算法的优缺点:在机器学习中待处理数据的呈现方式的重要性,以及应重点关注数据的哪些方面:模型评估和调参的方法,重点讲解交叉验证和网格搜索:管道的概念:如何将前面各章的方

python机器学习基础教程-鸢尾花分类

一: 环境准备: 1.导入的库: import numpy as np import matplotlib.pyplot as plt import pandas as pd import mglearn 2.导入数据集 from sklearn.datasets import load_iris iris_dataset = load_iris() 二. 划分训练数据和测试数据 1. train_test_split: 将数据集打乱并进行拆分 from sklearn.model_select

《Python机器学习基础教程》高清中文版PDF+高清英文版PDF+源代码

资源链接:https://pan.baidu.com/s/1sa64QTsQ7A5WlZxMuNmYHg<Python机器学习基础教程>高清中文版PDF+高清英文版PDF+源代码高清中文版PDF,306页,带目录和书签,文字能够复制粘贴:高清英文版PDF,392页,带目录和书签,彩色配图,文字能够复制粘贴:中英文两版可以对比学习.配套源代码:经典书籍,讲解详细:其中,高清中文版如图: 原文地址:http://blog.51cto.com/14063572/2317004

Python机器学习基础教程

介绍 本系列教程基本就是搬运<Python机器学习基础教程>里面的实例. Github仓库 使用 jupyternote book 是一个很好的快速构建代码的选择,本系列教程都能在我的Github仓库找到对应的 jupyter notebook . Github仓库:https://github.com/Holy-Shine/Introduciton-2-ML-with-Python-notebook 系列教程入口 Python机器学习基础教程-第一章-鸢尾花的例子KNN 原文地址:https

段小手《深入浅出Python机器学习》PDF+代码+《Python机器学习基础教程》高清中英文PDF代码+张亮

机器学习正在迅速改变我们的世界.我们几乎每天都会读到机器学习如何改变日常的生活.如果你在淘宝或者京东这样的电子商务网站购买商品,或者在爱奇艺或是腾讯视频这样的视频网站观看节目,甚至只是进行一次百度搜索,就已经触碰到了机器学习的应用.使用这些服务的用户会产生数据,这些数据会被收集,在进行预处理之后用来训练模型,而模型会通过这些数据来提供更好的用户体验. 此外,目前还有很多使用机器学习技术的产品或服务即将在我们的生活当中普及,如能够解放双手的无人驾驶汽车.聪明伶俐的智能家居产品.善解人意的导购机器人

机器学习资料《分布式机器学习算法理论与实践》+《白话机器学习算法》+《Python机器学习基础教程》

机器学习正在迅速改变我们的世界.我们几乎每天都会读到机器学习如何改变日常的生活. 人工智能和大数据时代,解决最有挑战性问题的主流方案是分布式机器学习! <分布式机器学习:算法.理论与实践>电子书资料全面介绍分布式机器学习的现状,深入分析其中的核心技术问题,并且讨论该领域未来的发展方向. 我认为第3章到第8章是核心,讲解分布式机器学习的框架及其各个功能,分别针对其中的数据与模型划分模块.单机优化模块.通信模块.数据与模型聚合模块加以介绍.最有用的是第9章,学习由分布式机器学习框架中不同选项所组合

学python入门基础教程[推荐]

python入门经典必备推荐基础教程 绝对是python初学者入门必备,比learning python写的好100倍, 远超python基础教程n个数量级 下载地址 http://pan.baidu.com/s/1jGwzpeY 更多python学习资料 http://dou.bz/35ODPo