Numpy, Scipy, Matplotlib基本用法

学习内容来自:Numpy Tutorial


基本的用法课程里面说的挺详细了。 特别记录一些需要关注的点。

Array Slicing

使用固定数字进行array寻址会导致数组降维。

y = np.random.random((3,2))
print(y)
[[0.44339891 0.27660025]
 [0.9809724  0.88663973]
 [0.18171569 0.72078505]]
print(y[0])
[0.44339891 0.27660025]

print(y[0,0])
0.4433989126430079

print(y[:1])
[[0.44339891 0.27660025]]

print(y[:1, :1])
[[0.44339891]]

Array Indexing

除了基础的类似于list 寻址的方法, numpy提供了另外的方便寻址法。

假设要从 d d d 维的tensor 中取出 n n n 个数据, 坐标分别是 ( x 1 ( 1 ) , x 2 ( 1 ) , ⋯   , x d ( 1 ) ) , ( x 1 ( 2 ) , x 2 ( 2 ) , ⋯   , x d ( 2 ) ) , ⋯   , ( x 1 ( n ) , x 2 ( n ) , ⋯   , x d ( n ) ) (x^{(1)}_1, x^{(1)}_2, \dotsb, x^{(1)}_d), (x^{(2)}_1, x^{(2)}_2, \dotsb, x^{(2)}_d),\dotsb, (x^{(n)}_1, x^{(n)}_2, \dotsb, x^{(n)}_d) (x1(1),x2(1),,xd(1)),(x1(2),x2(2),,xd(2)),,(x1(n),x2(n),,xd(n))

将上面的 n n n 个向量按照行拼接成矩阵, 然后做转置。 转置之后的每一行就是每个元素同一维度下的坐标。

按照 ( x 1 ( 1 ) , x 1 ( 2 ) , ⋯   , x 1 ( n ) ) , ( x 2 ( 1 ) , x 2 ( 2 ) , ⋯   , x 2 ( n ) ) , ⋯   , ( x d ( 1 ) , x d ( 2 ) , ⋯   , x d ( n ) ) (x^{(1)}_1, x^{(2)}_1, \dotsb, x^{(n)}_1), (x^{(1)}_2, x^{(2)}_2, \dotsb, x^{(n)}_2),\dotsb, (x^{(1)}_d, x^{(2)}_d, \dotsb, x^{(n)}_d) (x1(1),x1(2),,x1(n)),(x2(1),x2(2),,x2(n)),,(xd(1),xd(2),,xd(n))

的方式重新进行寻址。 在 d d d 比较小的时候(我们经常使用矩阵作为运算对象), 这样的寻址方式非常简便。

a = np.array([[1,2], [3, 4], [5, 6]])

print(a[[0, 1, 2], [0, 1, 0]])  
[1, 4, 5]
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
b = np.array([0, 2, 0, 1])

print(a[np.arange(4), b])
[1, 6, 7, 11]

使用boolean矩阵寻址也是常用的方法。 如果是简单的判断条件, 可以直接写在方括号中。

Mathematical Manipulation

使用.dot 方法进行矩阵乘法, 而 ∗ * 用作同样大小矩阵的元素对应相乘。

像 v.dot(x) 这样的运算会返回一个新的实例, 不会直接改变 v 的值。

求和运算np.sum(mat, axis = d) 选定第 d d d 个维度进行求和。 如果axis = 1, 就返回同样的行数, 但是列数都变成了1.

Broadcasting

广播技术的简单概括: n n n 维和 m m m 维的tensor 做四则运算 ( n > m n>m n>m ), 要保证 m m m 维向量的低 n n n 维和 n n n 维向量每个维度的size 相同。

x = np.random.random((3,3,4,3,2))
y = np.random.random((3,2))
可以

x=np.random.random((3,3,4,3,2))
y = np.random.random((4,2))
不可

向量的outer product 是比较特殊的。

x = np.array([1,2,3])
y = np.array([1,2])

print(np.reshape(x, (3,1)) * y)
[[1 2]
 [2 4]
 [3 6]]

Image Processing

现在的Scipy版本中,已经从scipy.misc 中删除了imread, imsave, imresize 等内容。

现在可以从 imageio 库中 import imread, imsave, imwrite。

而 imresize 我们可以用numpy + PIL(pillow) 实现。

from PIL import Image
import numpy as np

# im = imresize(im, (size1, size2, ...))
im = np.array(Image.fromarray(im).resize((size1, size2, ...)))
im = imread("cat.png")
im = np.array(Image.fromarray(im).resize((300,300)))
imsave("cat1.png", im)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值