Scipy 直觀操作

Galois發表於2020-03-15

Scipy

Scipy 以 Numpy 的高效能陣列及其基本計算工具為基礎,提供了大量用來操作 Numpy 陣列的函式

qTUX6ZQRIg.png!large

影象處理-Image operations

SciPy 提供了些處理影象的基本功能

#對影象進行著色及調整大小

from scipy.misc import imread, imsave, imresize

# 將影象從磁碟讀取到Numpy陣列中
img = imread('./assets/Galactic.jpg')
print(img.dtype, img.shape)  # Prints "uint8 (966, 1280, 3)"

# 可通過將每個顏色通道縮放不同的標量常數來對影象進行著色。
# 對於該影象的shape是(966, 1280, 3),
# 我們用shape是(3,)的陣列 [1, 0.95, 0.9] 來乘與該陣列
# 由於Numpy的廣播機制,
# 紅色通道的等級將保持不變
# 綠色通道的標量常數將乘以0.55
# 藍色通道的標量常數將乘以0.5
img_tinted = img * [1, 0.55, 0.5]

# 將著色影象的畫素調整為300×300大小
img_tinted = imresize(img_tinted, (300, 300))

# 將做色後的影象寫回到磁碟裡
imsave('./assets/Galactic_tinted.jpg', img_tinted)

效果圖對比:
原始影象

mNy8MwHKZ0.png!large

著色和調整大小後的影象:

wMGvs3tQ16.png!large

兩點間距離-Distance between points

SciPy 提供了些用於計算點點之間的距離的函式

#計算給定集合中所有點之間的距離

import numpy as np
from scipy.spatial.distance import pdist, squareform

# 建立以下陣列,其中每一行都是二維空間中的一個點:
# [[0 1]
#  [1 0]
#  [2 0]]
x = np.array([[0, 1], [1, 0], [2, 0]])
print(x)

# 計算陣列 x 所有行(點)之間的歐式距離.
# d[i, j] 表示的是 x[i, :] 與 x[j, :] 之間的歐式距離
# 陣列d是即為下列陣列:
# [[ 0.          1.41421356  2.23606798]
#  [ 1.41421356  0.          1.        ]
#  [ 2.23606798  1.          0.        ]]
d = squareform(pdist(x, 'euclidean'))
print(d)

Matplotlib

Matplotlib 是一個 python 的 2D 繪相簿。

簡要介紹 matplotlib.pyplot 模組

最重要的函式就是 plot ,可以畫 2D 資料。

#僅僅在一個圖中繪畫一個函式影象

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()  # 必須使用show()函式來使影象出現

繪畫的影象:

vpscEMMgMJ.png!large

#在一個圖中繪畫多個函式,
#並給函式新增軸標籤、標題及圖例

import numpy as np
import matplotlib.pyplot as plt

# 計算正弦曲線和餘弦曲線上的(x,y)座標
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 使用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()

繪畫的影象:

8iKGBETvgh.png!large

繪製子圖-Subplots

使用 subplot() 來繪製子圖,即對同一個圖進行分割,以繪畫不同的函式。

#在一個圖裡畫兩個不同的函式

import numpy as np
import matplotlib.pyplot as plt

# 計算正弦曲線和餘弦曲線上的(x,y)座標
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 建立一個高度為2,寬度為1的子圖網格
# 並將第一個子圖設為活躍狀態
# subplot(a,b,c), 引數a表示分割後圖的高度
# b表示分割後圖的寬度,c表示將哪一個設為活躍
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()

python 分割後的子圖:

lUXj0KxKCd.png!large

影象-Images

通過 imshow() 函式來顯示影象在圖中。

#在圖中顯示照片

import numpy as np
from scipy.misc import imread, imresize
import matplotlib.pyplot as plt

img = imread('assets/Galactic.jpg')
img_tinted = img * [.3, .75, 1.1]

# 顯示原始照片
plt.subplot(1, 2, 1)
plt.imshow(img)

# 顯示著色照片
plt.subplot(1, 2, 2)

# 對於imshow()函式存在一個問題,
# 若使用的資料型別不是uint8,可能會出現奇怪的問題,所以必須進行顯示的強制轉換。
plt.imshow(np.uint8(img_tinted))
plt.show()

python 分割後的著色前後對比圖:

MjmOnVUnF3.png!large

本作品採用《CC 協議》,轉載必須註明作者和本文連結

不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章