Numpy学习总结 |
您所在的位置:网站首页 › 数据分析基础实验报告 › Numpy学习总结 |
转自:https://www.cnblogs.com/wj-1314/p/9722794.html 一、NumPy简介其官网是:http://www.numpy.org/ NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了CPython的GIL(全局解释器锁),运行效率极好,是大量机器学习框架的基础库! 关于GIL请参考博客:http://www.cnblogs.com/wj-1314/p/9056555.html NumPy的全名为Numeric Python,是一个开源的Python科学计算库,它包括: 一个强大的N维数组对象ndrray;比较成熟的(广播)函数库;用于整合C/C++和Fortran代码的工具包;实用的线性代数、傅里叶变换和随机数生成函数 NumPy的优点: 对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多;NumPy中的数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的;NumPy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得NumPy比纯Python代码高效得多当然,NumPy也有其不足之处,由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;此外,NumPy数组的通用性不及Python提供的list容器。因此,在科学计算之外的领域,NumPy的优势也就不那么明显。 关于Python Numpy矩阵的用法总结请参考博文:https://www.cnblogs.com/wj-1314/p/10244807.html 二,numpy保存二进制文件(.npy/.npz)ndarray对象可以保存到磁盘文件并从磁盘文件加载,可用的IO功能有: load()和save() 函数处理Numpy 二进制文件(带npy扩展名)。 loadtxt() 和savetxt() 函数处理正常的文本文件。Numpy为ndarray对象引入了一个简单的文件格式,这个npy文件在磁盘文件中,存储重建ndarray所需的数据,图形,dtype和其他信息,以便正确获取数组,即使该文件在具有不同架构的一台机器上。 numpy.load和numpy.save函数式以Numpy专用的二进制类型保存数据,这两个函数会自动处理元素类型和shape等信息,使用它们读写数组就方便多了,但是numpy.save输出的文件很难和其他语言编写的程序读入。 1,numpy.save保存一个数组到一个二进制的文件中,保存格式是.npy 参数介绍: 1 2 3 4 5 6 numpy.save(file, arr, allow_pickle=True, fix_imports=True)
file:文件名/文件路径 arr:要存储的数组 allow_pickle:布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可) fix_imports:为了方便Pyhton2中读取Python3保存的数据(可选参数,默认即可) 举例说明: 1 2 3 4 5 6 7 8 9 10 11 12 >>> import numpy as np #生成数据 >>> x=np.arange(10) >>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#数据保存 >>> np.save('save_x',x)
#读取保存的数据 >>> np.load('save_x.npy') array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 2,numpy.savez 这个同样是保存数组到一个二进制的文件中,但是厉害的是,它可以保存多个数组到同一个文件中,保存格式为.npz,它们其实就是多个前面np.save的保存的npy,再通过打包(未压缩)的方式把这些文件归到一个文件上,不行你再去解压npz文件就知道自己保存的是多个npy。 参数介绍: 1 2 3 4 5 numpy.savez(file, *args, **kwds)
file:文件名/文件路径 *args:要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名 kwds:(可选参数,默认即可) 举例说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 >>> import numpy as np #生成数据 >>> x=np.arange(10) >>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> y=np.sin(x) >>> y array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
#数据保存 >>> np.save('save_xy',x,y)
#读取保存的数据 >>> npzfile=np.load('save_xy.npz') >>> npzfile #是一个对象,无法读取
#按照组数默认的key进行访问 >>> npzfile['arr_0'] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> npzfile['arr_1'] array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]) 更加神奇的是,我们可以不适用Numpy给数组的key,而是自己给数组有意义的key,这样就可以不用去猜测自己加载数据是否是自己需要的。 1 2 3 4 5 6 7 8 9 10 11 12 #数据保存 >>> np.savez('newsave_xy',x=x,y=y)
#读取保存的数据 >>> npzfile=np.load('newsave_xy.npz')
#按照保存时设定组数key进行访问 >>> npzfile['x'] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> npzfile['y'] array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]) 在深度学习中,我们保存了训练集,验证集,测试集,还包括它们的标签,用这个方式存储起来,要加载什么有什么,文件数量大大减少,也不会到处改文件名。 3,savetxt()以简单文本文件格式存储和获取数组数据,通过savetxt()和loadtxt()函数来完成的。 1 2 3 4 5 6 7 import numpy as np
a = np.array([1,2,3,4,5]) np.savetxt('out.txt',a) b = np.loadtxt('out.txt') print(b) # [1. 2. 3. 4. 5.] savetxt()和loadtxt()函数接受附加的可选参数,例如页首,页尾和分隔符。 4,csv文件转化为npy格式下面有一个csv文件的数据,我想将其转化为npy格式,数据内容如下: + View Code 首先,数据是有索引,序列的,所以我们读取的时候要注意,转化代码如下: 1 2 3 4 5 6 7 8 import pandas as pd import numpy as np
file1 = 'Train_A_wear.csv' data1 = pd.read_csv(file1,header=0,index_col=0)
np.save('train_A_wear.npy',data1.values) data_A_wear = np.load('trainA_wear.npy') 三、数组ndarray Numpy中定义的最重要的对象是成为ndarray的N维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。 大部分的数组操作仅仅是修改元数据部分,而不改变其底层的实际数据。数组的维数称为秩,简单来说就是如果你需要获取数组中一个特定元素所需的坐标数,如a是一个2×3×4的矩阵,你索引其中的一个元素必须给定三个坐标a[x,y,z],故它的维数就是3。 我们可以直接将数组看作一种新的数据类型,就像list、tuple、dict一样,但数组中所有元素的类型必须是一致的,Python支持的数据类型有整型、浮点型以及复数型,但这些类型不足以满足科学计算的需求,因此NumPy中添加了许多其他的数据类型,如bool、inti、int64、float32、complex64等。同时,它也有许多其特有的属性和方法。 3.1 常用ndarray属性: dtype 描述数组元素的类型shape 以tuple表示的数组形状ndim 数组的维度size 数组中元素的个数itemsize 数组中的元素在内存所占字节数T 数组的转置flat 返回一个数组的迭代器,对flat赋值将导致整个数组的元素被覆盖real/imag 给出复数数组的实部/虚部nbytes 数组占用的存储空间1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import numpy as np
# 创建简单的列表 a = [1,2,3,4,5,6]
# 讲列表转换为数组 b = np.array(a)
# Numpy查看数组属性 print(b.size) #6
# 数组形状 print(b.shape) # (6,)
# 数组维度 print(b.ndim) # 1
# 数组元素类型 print(b.dtype) # int32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import numpy as np
a = np.array([1,2,3]) print(a) # [1 2 3]
# 多于一个维度 a = np.array([[1, 2], [3, 4]]) print(a) # [[1 2] # [3 4]]
# 最小维度 a = np.array([1, 2, 3,4,5], ndmin = 2) print(a) # [[1 2 3 4 5]]
# dtype 参数 a = np.array([1, 2, 3], dtype = complex) print(a) # [1.+0.j 2.+0.j 3.+0.j] ndarray 对象由计算机内存中的一维连续区域组成,带有将每个元素映射到内存块中某个位置的索引方案。 内存块以按行(C 风格)或按列(FORTRAN 或 MatLab 风格)的方式保存元素。 3.2 常用ndarray方法: reshape(…) 返回一个给定shape的数组的副本resize(…) 返回给定shape的数组,原数组shape发生改变flatten()/ravel() 返回展平数组,原数组不改变astype(dtype) 返回指定元素类型的数组副本fill() 将数组元素全部设定为一个标量值sum/Prod() 计算所有数组元素的和/积mean()/var()/std() 返回数组元素的均值/方差/标准差max()/min()/ptp()/median() 返回数组元素的最大值/最小值/取值范围/中位数argmax()/argmin() 返回最大值/最小值的索引sort() 对数组进行排序,axis指定排序的轴;kind指定排序算法,默认是快速排序view()/copy() view创造一个新的数组对象指向同一数据;copy是深复制tolist() 将数组完全转为列表,注意与直接使用list(array)的区别compress() 返回满足条件的元素构成的数组numpy.reshape: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import numpy as np a = np.arange(8) print('原始数组:') print(a) print('\n')
b = a.reshape(4,2) print('修改后的数组:') print(b)
'''结果 原始数组: [0 1 2 3 4 5 6 7]
修改后的数组: [[0 1] [2 3] [4 5] [6 7]] ''' numpy.ndarray.flatten: 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 import numpy as np a = np.arange(8).reshape(2,4)
print('原数组:') print(a) print('\n') # default is column-major
print('展开的数组:') print(a.flatten()) print('\n')
print('以 F 风格顺序展开的数组:') print(a.flatten(order = 'F')) '''结果: 原数组: [[0 1 2 3] [4 5 6 7]]
展开的数组: [0 1 2 3 4 5 6 7]
以 F 风格顺序展开的数组: [0 4 1 5 2 6 3 7] ''' numpy.ravel: 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 import numpy as np a = np.arange(8).reshape(2,4)
print('原数组:') print(a) print('\n')
print('调用 ravel 函数之后:') print(a.ravel()) print('\n')
print('以 F 风格顺序调用 ravel 函数之后:') print(a.ravel(order = 'F')) '''结果: 原数组: [[0 1 2 3] [4 5 6 7]]
调用 ravel 函数之后: [0 1 2 3 4 5 6 7]
以 F 风格顺序调用 ravel 函数之后: [0 4 1 5 2 6 3 7]''' 3.3 数组的创建 numpy中使用array()函数创建数组,array的首个参数一定是一个序列,可以是元组也可以是列表。 3.3.1 一维数组的创建 可以使用numpy中的arange()函数创建一维有序数组,它是内置函数range的扩展版。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 In [1]: import numpy as np
In [2]: ls1 = range(10)
In [3]: list(ls1)
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [4]: type(ls1)
Out[4]: range
In [5]: ls2 = np.arange(10)
In [6]: list(ls2)
Out[6]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [7]: type(ls2)
Out[7]: numpy.ndarray 通过arange生成的序列就不是简简单单的列表类型了,而是一个一维数组。 如果一维数组不是一个规律的有序元素,而是人为的输入,就需要array()函数创建了。 1 2 3 4 5 6 7 8 9 In [8]: arr1 = np.array((1,20,13,28,22))
In [9]: arr1
Out[9]: array([ 1, 20, 13, 28, 22])
In [10]: type(arr1)
Out[10]: numpy.ndarray 上面是由元组序列构成的一维数组。 1 2 3 4 5 6 7 8 9 In [11]: arr2 = np.array([1,1,2,3,5,8,13,21])
In [12]: arr2
Out[12]: array([ 1, 1, 2, 3, 5, 8, 13, 21])
In [13]: type(arr2)
Out[13]: numpy.ndarray 上面是由列表序列构成的一维数组。 3.3.2 二维数组的创建 二维数组的创建,其实在就是列表套列表或元组套元组。 1 2 3 4 5 6 7 8 9 10 11 In [14]: arr3 = np.array(((1,1,2,3),(5,8,13,21),(34,55,89,144)))
In [15]: arr3
Out[15]:
array([[ 1, 1, 2, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144]]) 上面使用元组套元组的方式。 1 2 3 4 5 6 7 8 9 10 11 In [16]: arr4 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
In [17]: arr4
Out[17]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]]) 上面使用列表套列表的方式。 对于高维数组在将来的数据分析中用的比较少,这里关于高维数组的创建就不赘述了,构建方法仍然是套的方式。 上面所介绍的都是人为设定的一维、二维或高维数组,numpy中也提供了几种特殊的数组,它们是: 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 32 33 34 35 36 37 38 39 40 41 42 In [18]: np.ones(3) #返回一维元素全为1的数组
Out[18]: array([ 1., 1., 1.])
In [19]: np.ones([3,4]) #返回元素全为1的3×4二维数组
Out[19]:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
In [20]: np.zeros(3) #返回一维元素全为0的数组
Out[20]: array([ 0., 0., 0.])
In [21]: np.zeros([3,4]) #返回元素全为0的3×4二维数组
Out[21]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
In [22]: np.empty(3) #返回一维空数组
Out[22]: array([ 0., 0., 0.])
In [23]: np.empty([3,4]) #返回3×4二维空数组
Out[23]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]) 3.3.3 ones函数 返回特定大小,以1填充的新数组 1 2 3 4 5 6 7 >>> import numpy as np >>> a=np.ones(3);a array([ 1., 1., 1.]) >>> b=np.ones((3,2));b array([[ 1., 1.], [ 1., 1.], [ 1., 1.]]) 3.3.4 zeros函数 返回特定大小,以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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 def zeros(shape, dtype=None, order='C'): # real signature unknown; restored from __doc__ """ zeros(shape, dtype=float, order='C')
Return a new array of given shape and type, filled with zeros.
Parameters ---------- shape : int or tuple of ints Shape of the new array, e.g., ``(2, 3)`` or ``2``. dtype : data-type, optional The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`. order : {'C', 'F'}, optional, default: 'C' Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
Returns ------- out : ndarray Array of zeros with the given shape, dtype, and order.
See Also -------- zeros_like : Return an array of zeros with shape and type of input. empty : Return a new uninitialized array. ones : Return a new array setting values to one. full : Return a new array of given shape filled with value.
Examples -------- >>> np.zeros(5) array([ 0., 0., 0., 0., 0.])
>>> np.zeros((5,), dtype=int) array([0, 0, 0, 0, 0])
>>> np.zeros((2, 1)) array([[ 0.], [ 0.]])
>>> s = (2,2) >>> np.zeros(s) array([[ 0., 0.], [ 0., 0.]])
>>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype array([(0, 0), (0, 0)], dtype=[('x', ' |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |