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鼎力支持!