Numpy基础:数组、矢量计算以及ufunc通用函数使用
来源:互联网 发布:.net和java的语法区别 编辑:程序博客网 时间:2024/05/23 07:23
Numpy-darray多数组对象
ndarry是一种通用的同构数据多维容器,即,容器里的所有元素都是相同类型的。每个数组元素都有一个shape(多维数组的行列数)和dtype(元素类型)属性。
1 常用的数组创建函数
import numpy as np#生成一个原始数组arrayInit = np.arange(2,10,2)arrayInit
array([2, 4, 6, 8])
print arrayInit.shape,arrayInit.dtype
(4L,) int32
可以通过reshape(n,m)来改变原始数组的行列分布
arrayInit.reshape(2,2)
array([[2, 4], [6, 8]])
注意reshape并不改变原来的数组
演示使用asarray
np.asarray(arrayInit)
array([2, 4, 6, 8])
arrayInit
array([2, 4, 6, 8])
arrayOne = np.arange(6).reshape(2,3)arrayOne
array([[0, 1, 2], [3, 4, 5]])
np.asarray(arrayOne)
array([[0, 1, 2], [3, 4, 5]])
tem = [1,2,3]np.asarray(tem)
array([1, 2, 3])
tem
[1, 2, 3]
从上述代码中可以看出,这些函数仅是创建新的narray,并不改变原来的输入数据,若想保留该创建需要创建新的变量
2 数组和标量之间的运算
矢量化:可以对数据执行批量运算。数组可以实现矢量化,大小相等的数组之间的任何算数运算都会将运算应用到元素级
arrayTwo = np.array([[1,2,3],[4,5,6]])#将列表转换成narrayarrayTwo
array([[1, 2, 3], [4, 5, 6]])
arrayTwo * arrayTwo
array([[ 1, 4, 9], [16, 25, 36]])
arrayTwo**2
array([[ 1, 4, 9], [16, 25, 36]])
arrayTwo + arrayTwo
array([[ 2, 4, 6], [ 8, 10, 12]])
广播:不同大小的数组之间的运算
1.0/arrayTwo.astype(float)#astype并不改变原数组
array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]])
arrayTwo
array([[1, 2, 3], [4, 5, 6]])
1.0/arrayTwo
array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]])
3 narray基本的索引和切片
索引,注意索引会修改原数组,除非用.copy()重新赋值
array3 = np.arange(10)array3[5]
5
array3[5:8] =12array3
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arraytem = array3[1:4]arraytem
array([1, 2, 3])
arraytem[:] = 12array3
array([ 0, 12, 12, 12, 4, 12, 12, 12, 8, 9])
array4 = array3[8:10].copy()
array4
array([8, 9])
array4[:] = 0
array3
array([ 0, 12, 12, 12, 4, 12, 12, 12, 8, 9])
切片索引
array5 = np.ones((3,4))
array5
array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
array5[2]#取出第三行向量
array([ 1., 1., 1., 1.])
array5[1][1]
1.0
array5[1,1]
1.0
array5[1,:1]
array([ 1.])
注意上述两行命令的结果不同,虽然都是取出一个数,但是,行列号直接索引的结果是一个元素数据,存在切片的返回结果是narray.
布尔型索引
布尔型数组的长度必须跟被索引的轴长度一致。此外,布尔型数组还可以和切边,整数混合使用。
data = np.arange(32).reshape((8,4))data
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]])
char = np.array(['a','b','c','d','e','f','g','h'])char == 'b'
array([False, True, False, False, False, False, False, False], dtype=bool)
data[char == 'b']#布尔型索引返回的与原数据一样的类型,返回矩阵
array([[4, 5, 6, 7]])
data[char == 'b'][:,3]
array([7])
data[1,3]
7
data[1:2,3]
array([7])
data[char == 'b'][0]#取出数组
array([4, 5, 6, 7])
花式索引
花式索引是利用整数数组进行索引的。
array6 = np.empty((8,4))for i in range(8): array6[i] =iarray6
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.]])
array6[[4,3,0]]#花式索引传入列表,array会按照列表元素进行索引
array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.]])
array6[[-1,-2,-3]]#从后索引
array([[ 7., 7., 7., 7.], [ 6., 6., 6., 6.], [ 5., 5., 5., 5.]])
array7 = array6[[-1,-2,-3]]
array7
array([[ 7., 7., 7., 7.], [ 6., 6., 6., 6.], [ 5., 5., 5., 5.]])
array7[1] =0
array7
array([[ 7., 7., 7., 7.], [ 0., 0., 0., 0.], [ 5., 5., 5., 5.]])
array6
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.]])
注意,花式索引和切片不一样,花式索引会返回一个新数组,改变新数组的值不影响原来的数组
4 数组转置和轴对换
转置(transpose)是重塑的一种特殊形式,它返回的是原数据的视图(不会进行任何复制操作)。
array8 = np.arange(15).reshape((3,5))array8
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
array8.transpose()
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
array8.T
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
np.dot(array8,array8.T)#计算矩阵内积
array([[ 30, 80, 130], [ 80, 255, 430], [130, 430, 730]])
看下复杂的轴变换,在三维空间
array9 = np.arange(16).reshape((2,2,4))array9
array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]])
array9.T#结果看着有点蒙圈~
array([[[ 0, 8], [ 4, 12]], [[ 1, 9], [ 5, 13]], [[ 2, 10], [ 6, 14]], [[ 3, 11], [ 7, 15]]])
array9.transpose((0,2,1))
array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [10, 14], [11, 15]]])
array9.transpose((1,0,2))
array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]])
array9.swapaxes(1,2)
array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [10, 14], [11, 15]]])
5 划重点—通用函数:快速的元素级数组函数
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。他有一个好听的名字–矢量化包装器
下边将会给出两个通用函数表格,一元ufunc和二元ufunc
array8
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
array = array8[:,:4]array
array([[ 0, 1, 2, 3], [ 5, 6, 7, 8], [10, 11, 12, 13]])
array7
array([[ 7., 7., 7., 7.], [ 0., 0., 0., 0.], [ 5., 5., 5., 5.]])
np.sqrt(array8)
array([[ 0. , 1. , 1.41421356, 1.73205081, 2. ], [ 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ], [ 3.16227766, 3.31662479, 3.46410162, 3.60555128, 3.74165739]])
np.cos(array8)
array([[ 1. , 0.54030231, -0.41614684, -0.9899925 , -0.65364362], [ 0.28366219, 0.96017029, 0.75390225, -0.14550003, -0.91113026], [-0.83907153, 0.0044257 , 0.84385396, 0.90744678, 0.13673722]])
np.add(array,array7)
array([[ 7., 8., 9., 10.], [ 5., 6., 7., 8.], [ 15., 16., 17., 18.]])
总结
本篇博客主要介绍了,python的数据分析库numpy的创建、索引和切片、通用函数的基本操作指令。
阅读全文
1 0
- Numpy基础:数组、矢量计算以及ufunc通用函数使用
- Numpy基础:数组和矢量计算
- Numpy基础:数组和矢量计算
- NumPy基础:数组和矢量计算
- numpy中的通用函数(ufunc)的广播机制(Broadcasting)依赖于数组shape属性
- Numpy-ufunc函数
- numpy数组及矢量计算
- 【11月12日】NumPy基础:数组和矢量计算
- python科学计算之numpy——ufunc函数
- 8、NumPy 基础:数组和矢量运算
- Python数据分析|第4章 NumPy基础:数组和矢量计算
- Numpy基础 --数组和矢量计算 利用Python进行数据分析读书笔记
- 《利用Python进行数据分析》笔记---第4章NumPy基础:数组和矢量计算
- numpy教程:函数库和ufunc函数
- numpy数组矢量化
- Python之NumPy实践之数组和矢量计算
- python——NumPy:数组和矢量计算
- pandas+numpy ufunc重写question2计算位温
- 【JavaWeb_Part01】入门 MySQL 数据库
- 完美解决Android Studio 运行时出现的警告信息?
- NP完全问题习题证明
- 演示如何实现Matplotlib绘图并保存图像但不显示图形的方法
- 20170609
- Numpy基础:数组、矢量计算以及ufunc通用函数使用
- 关于拦截器超时的使用
- 20170623:七周七数据分析,Excel篇
- Idea、Android Studio的git使用方法
- Vue.js 表格查询与更新
- linux常用命令
- 转:OBS-Studio MAC平台编译 --- 史上最全
- cordova混合式开发:实现头像裁切、本地缩放、上传,适用于android和ios
- Zookeeper简单介绍