用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。这一小节只讨论NumPy的内置二进制格式,因为更多的用户会使用pandas或其它工具加载文本或表格数据
np.savenp.load 是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的

  1. In [2]: arr = np.arange(10)
  2. In [7]: np.save('some_array', arr)

如果文件路径末尾没有扩展名.npy, 则该扩展名会被自动加上。 然后就可以通过 np.load 读取磁盘上的数组

  1. In [8]: np.load('some_array.npy')
  2. Out[8]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

通过 np.savez 可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可
加载.npz文件时, 你会得到一个类似字典的对象, 该对象会对各个数组进行延迟加载

  1. In [9]: np.savez('array_archive.npz', a=arr, b=arr)
  2. In [10]: arch = np.load('array_archive.npz')
  3. In [11]: arch['a']
  4. Out[11]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果要将数据压缩, 可以使用 np.savez_compressed #

线性代数

NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数)

  1. In [12]: x = np.array([[1., 2., 3.], [4., 5., 6.]])
  2. In [13]: y = np.array([[6., 23.], [-1, 7], [8, 9]])
  3. In [14]: x
  4. Out[14]:
  5. array([[1., 2., 3.],
  6. [4., 5., 6.]])
  7. In [15]: y
  8. Out[15]:
  9. array([[ 6., 23.],
  10. [-1., 7.],
  11. [ 8., 9.]])
  12. In [16]: x.dot(y)
  13. Out[16]:
  14. array([[ 28., 64.],
  15. [ 67., 181.]])

x.dot(y)等价于np.dot(x, y)

一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组

  1. In [17]: np.dot(x, np.ones(3))
  2. Out[17]: array([ 6., 15.])

@符(类似Python 3.5)也可以用作中缀运算符,进行矩阵乘法

  1. In [18]: x @ np.ones(3)
  2. Out[18]: array([ 6., 15.])

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。 它们跟MATLAB和R等语言所使用的是相同的行业标准线性代数库, 如BLAS、 LAPACK、 Intel MKL(Math KernelLibrary, 可能有, 取决于你的NumPy版本)等

  1. In [19]: from numpy.linalg import inv, qr
  2. In [20]: x = np.random.randn(5, 5)
  3. In [21]: mat = x.T.dot(x)
  4. In [22]: inv(mat)
  5. Out[22]:
  6. array([[ 5.22221687, 1.65499557, -3.16941569, -0.9323684 , 0.23349725],
  7. [ 1.65499557, 1.331141 , -0.0781365 , -0.35246569, 0.59420201],
  8. [-3.16941569, -0.0781365 , 3.7820802 , 0.47325973, 0.62431255],
  9. [-0.9323684 , -0.35246569, 0.47325973, 0.28925202, -0.04056748],
  10. [ 0.23349725, 0.59420201, 0.62431255, -0.04056748, 0.58429997]])
  11. In [23]: mat.dot(inv(mat))
  12. Out[23]:
  13. array([[ 1.00000000e+00, -8.46401334e-17, -2.41863703e-17,
  14. -1.24692905e-17, 2.95767910e-18],
  15. [-2.50894701e-16, 1.00000000e+00, 7.42095005e-16,
  16. 8.29051645e-17, 4.47044416e-16],
  17. [ 2.28527494e-16, -1.06524210e-16, 1.00000000e+00,
  18. -5.45780656e-17, -4.38657814e-17],
  19. [-1.16116044e-15, -7.72706010e-16, 4.17276971e-16,
  20. 1.00000000e+00, 2.39301353e-17],
  21. [-2.79879314e-16, 2.77275082e-16, -1.52190892e-16,
  22. 3.25298884e-17, 1.00000000e+00]])
  23. In [24]: q, r = qr(mat)
  24. In [25]: r
  25. Out[25]:
  26. array([[-3.3937097 , 1.8932563 , -2.45878698, -6.20936349, 1.94190033],
  27. [ 0. , -4.49366069, -0.22089644, -5.98643392, 5.36630391],
  28. [ 0. , 0. , -1.076367 , 4.34934862, 2.44981532],
  29. [ 0. , 0. , 0. , -0.88445694, -0.12960881],
  30. [ 0. , 0. , 0. , 0. , 0.93641524]])

下表是常用的numpy.linalg函数
image.png