4. Numpy形变函数

本章主要展示一些numpy下对数组、矩阵的形状变化的函数。形变即NumPy的数组的维度的变化,例如一维变二维数组。

4.1 数组维度变化

在NumPy里有很多的可以变化数组的维度的函数,例如reshape函数、resize函数等,尽管这些都能实现对数组的维度的变化,但这些函数还是有一些差异。

1). reshape函数

某个维度维数组(向量)为另外一个维度可以用reshape函数,在reshape函数里以元组、列表给出变化后的形状数据,并不影响原数组会新生成一个多维数组

from numpy import *
a = arange(12)
print a
b = a.reshape((3, 4))
print "*" * 20
print b

2). 修改数组的shape属性

在NumPy里可以修改数组的shape属性直接改变原数组的维度

#coding:utf-8
from numpy import *
a = arange(12)
print "a", "*" * 20
print a
c = a
c.shape = (2, 6) # 修改数组的shape属性
print "c", "*" * 20
print c
print "a", "*" * 20
print a

程序执行结果:

a ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]
c ********************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
a ********************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]

从执行结果可以看出c和a都指向同一个数据(用的是=赋值),修改了c的shape也就影响了a的shape。

这里可以使用numpy的copy函数,这样可以复制一份a的值给c,修改了c不影响a。

from numpy import *
a = arange(12)
print "a", "*" * 20
print a
c = copy(a)
c.shape = (2, 6)
print "c", "*" * 20
print c
print "a", "*" * 20
print a

程序执行结果:

a ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]
c ********************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
a ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]

从结果可以看出c和a是两个存储在不同内存的数据,修改了c并未影响a的形状变化。

3). resize函数

类似于修改数组本身的shape属性来改变数组的维度,在NumPy里有个函数叫resize,影响的也是数组本身。

from numpy import *
a = arange(12)
print "a", "*" * 20
print a

a.shape = (2, 6)
print "a", "*" * 20
print a

b = a.resize([3, 4])
print "b", "*" * 20
print b
print "a", "*" * 20
print a

程序执行结果如下:

a ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]
a ********************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
b ********************
None
a ********************
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

b代表resize的返回值,b并不是对a进行resize后新产生了一个数组赋给了b,resize影响a本身。

需要说明的是这里使用的resize是numpy.ndarray下的resize函数,而不是numpy的resize函数。

>>> from numpy import *
>>> help(resize)
>>> help(ndarray.resize)

4.2 多维变一维

多维变一维可以用ravel、flatten函数。

from numpy import *
a = arange(12)
print "a", "*" * 20
print a

a.shape = (2, 6)
print "a", "*" * 20
print a

b = a.ravel()
print "b", "*" * 20
print b

c = a.flatten()
print "c", "*" * 20
print c

程序执行结果:

a ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]
a ********************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
b ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]
c ********************
[ 0  1  2  3  4  5  6  7  8  9 10 11]

4.3 数组的转置 transpose函数

这个函数返回矩阵的转置矩阵,比较简单。

感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!