Numpy, Scipy, Matplotlib基本用法_MagicGeek的博客-程序员宅基地

技术标签: Python  

学习内容来自: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)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36284852/article/details/104952330

智能推荐

关于字符数组以及字符串数组_一尾鱼汤的博客-程序员宅基地

例题13://13.编写一程序,将两个字符串连接起来,结果取代第一个字符串(mark下来加深印象),加油加油加油!(1)自己编写一个strcat函数int main(){ int strcat(char a[100],char b[100]); char a[100]={0}, b[100]={0}; //初始化字符数组; int i=0,j=0; cout<<"请输入两个字符串:"; cin>>a>>b;

Python配置Qt Designer与PyUIC_热心市民付先生的博客-程序员宅基地_python pyuic

Python配置Qt Designer与PyUIC安装pyqt相关包pip install pyqtpip install pyqt5-toolsPyCharm中选择相应的python解释器3. 添加外部工具名称填写自己方便易记得即可,我的名称添加为QTDesigner程序选择designer.exe,位置为当前解释器路径下的Lib\site-packages\pyqt5-tools\designer.exe工作目录为当前项目文件的目录添加选择完毕界面为:确定即可,再次

关于WebSocket_彪彪_的博客-程序员宅基地

原文链接:https://www.liaoxuefeng.com/wiki/1022910821149312/1103303693824096WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器。为什么传统的HTTP协议不能做到WebSocket实现的功能?这是因为HTTP协议是一个请求-响应协议,...

FineUI初学手册_star_2008_的博客-程序员宅基地

女朋友鄙视我原创少...1.下载 进入官方论坛:http://www.fineui.com/bbs/要用到下载源代码和空项目下载http://fineui.codeplex.com/http://fineui.com/bbs/forum.php?mod=viewthread&tid=2123源代码直接下载,注意FineUI版本空项目里下载 对应版本的空项

NSStringDrawingOptions_yinachong的博客-程序员宅基地

NSStringDrawingTruncatesLastVisibleLine:如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。NSStringDrawingUsesLineFragmentOrigin:绘制文本时使用 line fragement or

随便推点

HTML5 APP----2014年H5没火,why?2016年H5能火,why?_谷震平的博客-程序员宅基地

0 前言        HTML5做跨平台的APP,在大多数人的脑子里没有什么好感,我身边的朋友也这么说。Anyway,我用完以后得出这样的结论:HTML5跨平台APP开发,在2015年以后会越来越火。    在2014年以前,HTML5的性能和能力都不够充足。特别是性能,因为Android4.4以下版本不能支持webGL技术,所以大部分低端Android手机无法流畅运行手机APP。D

Chromium多进程架构初探-兼谈Android平台版本_coloriy的博客-程序员宅基地

Chromium以多进程架构著称,它主要包含四类进程,分别是Browser进程、Render进程、GPU进程和Plugin进程。之所以要将Render进程、GPU进程和Plugin进程独立出来,是为了解决它们的不稳定性问题。也就是说,Render进程、GPU进程和Plugin进程由于不稳定而引发的Crash不会导致整个浏览器崩溃。本文就对Chromium的多进程架构进行简要介绍,以及制定学习计划。

Mybatis源码分析_风铃峰顶的博客-程序员宅基地

实例import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.*;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List; private SqlSessionF

Composer常见问题汇总_cicibi6696的博客-程序员宅基地

问题一: [Composer\Downloader\TransportException] ...

什么时候不能使用箭头函数_一水茶缘YY的博客-程序员宅基地

共 2670 字,读完需 5 分钟。编译自 Dmitri Pavlutin 的文章,对原文内容做了精简和代码风格优化。ES6 中引入的箭头函数可以让我们写出更简洁的代码,但是部分场景下使用箭头函数会带来严重的问题,有哪些场景?会导致什么问题?该怎么解决,容我慢慢道来。能见证每天在用的编程语言不断演化是一件让人非常兴奋的事情,从错误中学习、探索更好的语言实现、创造新的语言特性是推动编程语言版本迭代的动