01. Python 工具
02. Python 基础
03. Numpy
- Numpy 简介
- Matplotlib 基础
- Numpy 数组及其索引
- 数组类型
- 数组方法
- 数组排序
- 数组形状
- 对角线
- 数组与字符串的转换
- 数组属性方法总结
- 生成数组的函数
- 矩阵
- 一般函数
- 向量化函数
- 二元运算
- ufunc 对象
- choose 函数实现条件筛选
- 数组广播机制
- 数组读写
- 结构化数组
- 记录数组
- 内存映射
- 从 Matlab 到 Numpy
04. Scipy
05. Python 进阶
- sys 模块简介
- 与操作系统进行交互:os 模块
- CSV 文件和 csv 模块
- 正则表达式和 re 模块
- datetime 模块
- SQL 数据库
- 对象关系映射
- 函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
- 迭代器
- 生成器
- with 语句和上下文管理器
- 修饰符
- 修饰符的使用
- operator, functools, itertools, toolz, fn, funcy 模块
- 作用域
- 动态编译
06. Matplotlib
- Pyplot 教程
- 使用 style 来配置 pyplot 风格
- 处理文本(基础)
- 处理文本(数学表达式)
- 图像基础
- 注释
- 标签
- figures, subplots, axes 和 ticks 对象
- 不要迷信默认设置
- 各种绘图实例
07. 使用其他语言进行扩展
- 简介
- Python 扩展模块
- Cython:Cython 基础,将源代码转换成扩展模块
- Cython:Cython 语法,调用其他C库
- Cython:class 和 cdef class,使用 C++
- Cython:Typed memoryviews
- 生成编译注释
- ctypes
08. 面向对象编程
09. Theano 基础
- Theano 简介及其安装
- Theano 基础
- Theano 在 Windows 上的配置
- Theano 符号图结构
- Theano 配置和编译模式
- Theano 条件语句
- Theano 循环:scan(详解)
- Theano 实例:线性回归
- Theano 实例:Logistic 回归
- Theano 实例:Softmax 回归
- Theano 实例:人工神经网络
- Theano 随机数流变量
- Theano 实例:更复杂的网络
- Theano 实例:卷积神经网络
- Theano tensor 模块:基础
- Theano tensor 模块:索引
- Theano tensor 模块:操作符和逐元素操作
- Theano tensor 模块:nnet 子模块
- Theano tensor 模块:conv 子模块
10. 有趣的第三方模块
11. 有用的工具
- pprint 模块:打印 Python 对象
- pickle, cPickle 模块:序列化 Python 对象
- json 模块:处理 JSON 数据
- glob 模块:文件模式匹配
- shutil 模块:高级文件操作
- gzip, zipfile, tarfile 模块:处理压缩文件
- logging 模块:记录日志
- string 模块:字符串处理
- collections 模块:更多数据结构
- requests 模块:HTTP for Human
12. Pandas
数组形状
In [1]:
%pylab
Using matplotlib backend: Qt4Agg
Populating the interactive namespace from numpy and matplotlib
修改数组的形状
In [2]:
a = arange(6)
a
Out[2]:
array([0, 1, 2, 3, 4, 5])
将形状修改为2乘3:
In [3]:
a.shape = 2,3
a
Out[3]:
array([[0, 1, 2],
[3, 4, 5]])
与之对应的方法是 reshape
,但它不会修改原来数组的值,而是返回一个新的数组:
In [4]:
a.reshape(3,2)
Out[4]:
array([[0, 1],
[2, 3],
[4, 5]])
In [5]:
a
Out[5]:
array([[0, 1, 2],
[3, 4, 5]])
shape
和 reshape
方法不能改变数组中元素的总数,否则会报错:
In [6]:
a.reshape(4,2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-1a35a76a1693> in <module>()
----> 1 a.reshape(4,2)
ValueError: total size of new array must be unchanged
使用 newaxis 增加数组维数
In [7]:
a = arange(3)
shape(a)
Out[7]:
(3L,)
In [8]:
y = a[newaxis, :]
shape(y)
Out[8]:
(1L, 3L)
根据插入位置的不同,可以返回不同形状的数组:
In [9]:
y = a[:, newaxis]
shape(y)
Out[9]:
(3L, 1L)
插入多个新维度:
In [10]:
y = a[newaxis, newaxis, :]
shape(y)
Out[10]:
(1L, 1L, 3L)
squeeze 方法去除多余的轴
In [11]:
a = arange(6)
a.shape = (2,1,3)
In [12]:
b = a.squeeze()
b.shape
Out[12]:
(2L, 3L)
squeeze 返回一个将所有长度为1的维度去除的新数组。
数组转置
使用 transpose
返回数组的转置,本质上是将所有维度反过来:
In [13]:
a
Out[13]:
array([[[0, 1, 2]],
[[3, 4, 5]]])
对于二维数组,这相当于交换行和列:
In [14]:
a.transpose()
Out[14]:
array([[[0, 3]],
[[1, 4]],
[[2, 5]]])
或者使用缩写属性:
In [15]:
a.T
Out[15]:
array([[[0, 3]],
[[1, 4]],
[[2, 5]]])
注意:
- 对于复数数组,转置并不返回复共轭,只是单纯的交换轴的位置
- 转置可以作用于多维数组
In [16]:
a = arange(60)
a
Out[16]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59])
In [17]:
a.shape = 3,4,5
a
Out[17]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29],
[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]],
[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])
In [18]:
b = a.T
b.shape
Out[18]:
(5L, 4L, 3L)
转置只是交换了轴的位置。
另一方面,转置返回的是对原数组的另一种view,所以改变转置会改变原来数组的值。
In [19]:
a = arange(6)
a.shape = (2,3)
a
Out[19]:
array([[0, 1, 2],
[3, 4, 5]])
修改转置:
In [20]:
b = a.T
b[0,1] = 30
原数组的值也改变:
In [21]:
a
Out[21]:
array([[ 0, 1, 2],
[30, 4, 5]])
数组连接
有时我们需要将不同的数组按照一定的顺序连接起来:
concatenate((a0,a1,...,aN), axis=0)
注意,这些数组要用 ()
包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的。
In [22]:
x = array([
[0,1,2],
[10,11,12]
])
y = array([
[50,51,52],
[60,61,62]
])
print x.shape
print y.shape
(2L, 3L)
(2L, 3L)
默认沿着第一维进行连接:
In [23]:
z = concatenate((x,y))
z
Out[23]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
In [24]:
z.shape
Out[24]:
(4L, 3L)
沿着第二维进行连接:
In [25]:
z = concatenate((x,y), axis=1)
z
Out[25]:
array([[ 0, 1, 2, 50, 51, 52],
[10, 11, 12, 60, 61, 62]])
In [26]:
z.shape
Out[26]:
(2L, 6L)
注意到这里 x
和 y
的形状是一样的,还可以将它们连接成三维的数组,但是 concatenate
不能提供这样的功能,不过可以这样:
In [27]:
z = array((x,y))
In [28]:
z.shape
Out[28]:
(2L, 2L, 3L)
事实上,Numpy提供了分别对应这三种情况的函数:
- vstack
- hstack
- dstack
In [29]:
vstack((x, y)).shape
Out[29]:
(4L, 3L)
In [30]:
hstack((x, y)).shape
Out[30]:
(2L, 6L)
In [31]:
dstack((x, y)).shape
Out[31]:
(2L, 3L, 2L)
Flatten 数组
flatten
方法的作用是将多维数组转化为1维数组:
In [32]:
a = array([[0,1],
[2,3]])
b = a.flatten()
b
Out[32]:
array([0, 1, 2, 3])
返回的是数组的复制,因此,改变 b
并不会影响 a
的值:
In [33]:
b[0] = 10
print b
print a
[10 1 2 3]
[[0 1]
[2 3]]
flat 属性
还可以使用数组自带的 flat
属性:
In [34]:
a.flat
Out[34]:
<numpy.flatiter at 0x3d546a0>
a.flat
相当于返回了所有元组组成的一个迭代器:
In [35]:
b = a.flat
In [36]:
b[0]
Out[36]:
0
但此时修改 b
的值会影响 a
:
In [37]:
b[0] = 10
print a
[[10 1]
[ 2 3]]
In [38]:
a.flat[:]
Out[38]:
array([10, 1, 2, 3])
ravel 方法
除此之外,还可以使用 ravel
方法,ravel
使用高效的表示方式:
In [39]:
a = array([[0,1],
[2,3]])
b = a.ravel()
b
Out[39]:
array([0, 1, 2, 3])
修改 b
会改变 a
:
In [40]:
b[0] = 10
a
Out[40]:
array([[10, 1],
[ 2, 3]])
但另一种情况下:
In [41]:
a = array([[0,1],
[2,3]])
aa = a.transpose()
b = aa.ravel()
b
Out[41]:
array([0, 2, 1, 3])
In [42]:
b[0] = 10
In [43]:
aa
Out[43]:
array([[0, 2],
[1, 3]])
In [44]:
a
Out[44]:
array([[0, 1],
[2, 3]])
可以看到,在这种情况下,修改 b
并不会改变 aa
的值,原因是我们用来 ravel
的对象 aa
本身是 a
的一个view。
atleast_xd 函数
保证数组至少有 x
维:
In [45]:
x = 1
atleast_1d(x)
Out[45]:
array([1])
In [46]:
a = array([1,2,3])
b = atleast_2d(a)
b.shape
Out[46]:
(1L, 3L)
In [47]:
b
Out[47]:
array([[1, 2, 3]])
In [48]:
c = atleast_3d(b)
In [49]:
c.shape
Out[49]:
(1L, 3L, 1L)
x
可以取值 1,2,3。
在Scipy库中,这些函数被用来保证输入满足一定的条件:“
用法 | Scipy中出现次数 |
---|---|
value.flaten() |
value.flat value.ravel() | ~2000次 | | atleast_1d(value) atleast_2d(value) | ~700次 | | asarray(value) | ~4000次 |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论