数析Python精选numpy干货

Python-高级-Numpy简介

2020-03-07  本文已影响0人  you的日常

Numpy 是什么?

Numpy 是 Python 中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。

如果您已经熟悉 MATLAB ,那么您可能会发现本教程对 Numpy 入门非常有用。

它主要包含下面内容:

除了科学计算用途外,NumPy 还可以用作通用数据的高效多维容器。可以定义任意数据类型。这使 NumPy 能够无缝快速地与各种数据库集成。特别在人工智能领域, Numpy 已经是不可或缺的基础库了。

Numpy 安装

安装 Numpy 最快的方式是通过 pip 安装,通过下面的命令进行安装

pip install numpy

然后按下回车键,系统将会自动安装 Numpy 及 Numpy 引用的包。

Numpy 安装

Numpy Array

Array 是一个数值的矩阵, 所有的数值有相同类型,网格的大小由一对非负整数组成的的数值对唯一确定。
Array 维数是阵列的秩;
Array 的形状是一个整数元组,给出了每个维度的数组大小。

我们可以从嵌套的 Python 列表初始化 numpy 数组,并使用方括号访问元素:

import numpy as np

#创建一维矩阵
a = np.array([1, 2, 3])                
print(type(a))                            
# Prints "<class 'numpy.ndarray'>"

print(a.shape)                           
# Prints "(3,)"

print(a[0], a[1], a[2])                  
# Prints "1 2 3"

 # 改变矩阵中的一个值
a[0] = 5                                   
print(a)                                     
# Prints "[5, 2, 3]"

# 创建二维矩阵
b = np.array([[1,2,3],[4,5,6]])    
print(b.shape)                          
# Prints "(2, 3)"

print(b[0, 0], b[0, 1], b[1, 0])     
# Prints "1 2 4"

Numpy 模块内部也提供了许多创建 array 的函数:

import numpy as np

# 创建全 `0` 矩阵
a = np.zeros((2,2))                               
print(a)                                                
# Prints "[[ 0.  0.]                                                            
#          [ 0.  0.]]"

# 创建全 `1` 矩阵
b = np.ones((1,2))                              
print(b)                                                
# Prints "[[ 1.  1.]]"

# 创建常数矩阵
c = np.full((2,2), 7)  
print(c)                                                
# Prints "[[ 7.  7.]                                                           
#          [ 7.  7.]]"

# 创建 2 x 2 单位矩阵
d = np.eye(2)         
print(d)                                               
# Prints "[[ 1.  0.]
#          [ 0.  1.]]"

# Create an array filled with random values
e = np.random.random((2,2)) 
print(e)                     
# Might print "[[ 0.91923167  0.08484941]
#               [ 0.68726234  0.84629387]]"

Array 索引

Numpy 提供了大量的内建函数来快速操作 array 对象。

切片

如果有 Python list 的经验,对切片的操作就不会感到陌生。Numpy 也提供了切片的功能。但是有一点需要特别注意:
Numpy Array 可能是多维的,因此必须为数组的每个维指定一个切片:

import numpy as np

# 创建3行4列的二维数组
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# 使用切片来拉出由前2行和第1列和第2列组成的子阵列;
# b是以下形状数组(2,2):
# [[2 3]
#  [6 7]]
b = a[:2, 1:3]

# 数组的切片是对相同数据的视图,因此修改它将修改原始数组。
print(a[0, 1])   
# Prints "2"

b[0, 1] = 88     
# b[0, 1] 和 a[0, 1] 有相同的数据

print(a[0, 1])   
# Prints "88"

Array 数据类型

每个 numpy 数组都是相同类型元素的集合。
Numpy 提供了一组可用于构造数组的大量数值数据类型。
Numpy尝试在创建数组时猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。

import numpy as np

# numpy 自动选择类型
x = np.array([1, 2])   
print(x.dtype)
# Prints "int64"

# numpy 自动选择类型
x = np.array([1.0, 2.0])   
print(x.dtype)             
# Prints "float64"

# 为 numpy 指定类型
x = np.array([1, 2], dtype=np.int64)   
print(x.dtype)                         
# Prints "int64"

Array 运算

基本的数学函数在数组上按元素运行,既可以作为运算符重载,也可以作为 numpy 模块中的函数。

import numpy as np

x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

# 元素和,两种方式都会产生新的array 对象
# [[ 6.0  8.0]
#  [10.0 12.0]]
print(x + y)
print(np.add(x, y))

# 元素差,两种方式都会产生新的array 对象
# [[-4.0 -4.0]
#  [-4.0 -4.0]]
print(x - y)
print(np.subtract(x, y))

# 元素相乘,两种方式都会产生新的array 对象
# [[ 5.0 12.0]
#  [21.0 32.0]]
print(x * y)
print(np.multiply(x, y))

# 元素相除,两种方式都会产生新的array 对象
# [[ 0.2         0.33333333]
#  [ 0.42857143  0.5       ]]
print(x / y)
print(np.divide(x, y))

# 元素的平方根,产生新的array 对象
# [[ 1.          1.41421356]
#  [ 1.73205081  2.        ]]
print(np.sqrt(x))

广播

Numpy 的广播是一种强大的机制,允许 numpy 对象在执行算术运算时使用不同形状的数组。

我们经常有一个较小的数组和一个更大的数组,我们希望多次使用较小的数组来对较大的数组执行某些操作。

import numpy as np

# 将向量v添加到矩阵x的每一行,将结果存储在矩阵y中
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x)   # 创建一个与x形状相同的空矩阵

# 添加向量v到矩阵x的每一行,
# 显式循环
for i in range(4):
    y[i, :] = x[i, :] + v

# Now y is the following
# [[ 2  2  4]
#  [ 5  5  7]
#  [ 8  8 10]
#  [11 11 13]]
print(y)

用一张图来理解这个过程:


广播示意图

广播的功能,在机器学习中有大量的应用。

广播通常会使您的代码更简洁,更快速,因此应该尽可能地使用它。

基于 Numpy 提供高级功能的第三方库

Numpy 提供了一个高性能的多维数组和基本工具来计算和操作这些数组。 很多的第三方库基于 numpy 提供的功能,定制化了很多新的功能,下面挑取一部分进行简介。

SciPy

Scipynumpy 为基础,提供了大量在numpy 数组上运行的函数,适用于不同类型的科学和工程应用程序。
SciPy 提供了一些处理图像的基本功能。

例如,它具有将图像从磁盘读取到numpy 数组,将numpy 数组作为图像写入磁盘以及调整图像大小的功能。

这是一个展示这些功能的简单示例

from scipy.misc import imread, imsave, imresize

# 读取本地的图片文件到 numpy array
img = imread('temp/cat.jpg')
print(img.dtype, img.shape)  
# Prints "uint8 (400, 248, 3)"

# 我们可以通过用不同的标量常数列出图片的参数。
# 图像具有形状(400,248,3);
# 我们将它乘以形状一维的数组[1,0.95,9.9]; 
# `numpy` 广播机制意味着它保持红色通道不变,并将绿色和蓝色通道分别乘以0.95和0.9。
img_tinted = img * [1, 0.95, 0.9]

# 同时将图片的size 调整为 300 x 300
img_tinted = imresize(img_tinted, (300, 300))

# 将修改后图片写进本地文件
imsave('temp/cat_tinted.jpg', img_tinted)
图片效果图

更多的例子请到 https://scipy.org/

Matplotlib

Matplotlib 是一个绘图库。

本节简要介绍matplotlib.pyplot模块,该模块提供了类似于MATLAB的绘图系统。

import numpy as np
import matplotlib.pyplot as plt

# 在正弦曲线上输入点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)

# 使用 matplotlib 显示绘制的图形
plt.plot(x, y)

# 必须呼叫 plt.show() 才能显示图片
plt.show()  
sin(x)

一个同时显示 sin(x) 和 cos(x) 的例子

import numpy as np
import matplotlib.pyplot as plt

# Compute the x and y coordinates for points on sine and cosine curves
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# Plot the points using matplotlib
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show()

sin VS. cos

更多的例子请到 https://matplotlib.org/

上一篇下一篇

猜你喜欢

热点阅读