赞
踩
学习内容来自:Numpy Tutorial
使用固定数字进行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]]
除了基础的类似于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矩阵寻址也是常用的方法。 如果是简单的判断条件, 可以直接写在方括号中。
使用.dot 方法进行矩阵乘法, 而 ∗ * ∗ 用作同样大小矩阵的元素对应相乘。
像 v.dot(x) 这样的运算会返回一个新的实例, 不会直接改变 v 的值。
求和运算np.sum(mat, axis = d) 选定第 d d d 个维度进行求和。 如果axis = 1, 就返回同样的行数, 但是列数都变成了1.
广播技术的简单概括: 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]]
现在的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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。