学海泛舟

python numpy及其他的初探.md

这篇文章主要是简单介绍一下python numpy的基本操作和与numpy相关的一些科学计算方面的东西。

#numpy

numpy相较于python的原生数组,有两个主要的优势,一是numpy的数组运算是经过优化的,其运算速度是远远快于原生数组的,二是很多数组相关的操作用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
import numpy as np
#创建一个数组
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#取数组中的元素
print(a[0, 1])
#切片操作
b = a[:2, 1:3]
print(b)
#以c中元素作为下标取a中的元素
c = np.array([1, 0, 2])
print(a[np.arange(3), c])
#矩阵乘法
v = np.array([9,10])
w = np.array([11, 12])
print (v.dot(w))
print (np.dot(v, w))
#转置
print(v.T)
#广播
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v
print(y)

numpy中的广播是一个十分重要的概念。

首先,不是所有函数都支持广播机制的,只有全局函数才支持广播机制的。

其次,广播机制要遵守几个规则:

  1. 如果数组的秩不同,就使用1来将秩较小的数组进行扩展,直到两者的秩相同(这里的秩指的是数组的维数)
  2. 如果两个数组在某个维度上的长度相同,或者其中一个数组在维度的长度为1,那么这两个数组就是相容的。如果它们在所有维度都是相容的,那么就能使用广播机制了。

科学计算相关的其他内容

图像操作

1
2
3
4
5
6
from scipy.misc import imread, imsave, imresize
img = imread('34683993_p0.jpg')
print(img.dtype, img.shape)
img_tinted = img * [1, 0.95, 0.9]
img_tinted = imresize(img_tinted, (300, 300))
imsave('34683993_p0.jpg_tinted.jpg', img_tinted)

绘图

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.subplot(2, 1, 1)
plt.plot(x, y_sin)
plt.title('Sine')
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
plt.show()

绘图相关的函数和matlab是十分相似的。