当前位置:   article > 正文

Numpy, Scipy, Matplotlib基本用法_np.imresize

np.imresize

学习内容来自: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]]
  • 1
  • 2
  • 3
  • 4
  • 5
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]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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]
  • 1
  • 2
  • 3
  • 4
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]
  • 1
  • 2
  • 3
  • 4
  • 5

使用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))
不可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

向量的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]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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, ...)))
  • 1
  • 2
  • 3
  • 4
  • 5
im = imread("cat.png")
im = np.array(Image.fromarray(im).resize((300,300)))
imsave("cat1.png", im)
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/987535
推荐阅读
相关标签
  

闽ICP备14008679号