Numpy学习总结

您所在的位置:网站首页 数据分析基础实验报告 Numpy学习总结

Numpy学习总结

2024-01-20 09:34| 来源: 网络整理| 查看: 265

转自: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