本文参考来源:
- http://wiki.scipy.org/Tentative_NumPy_Tutorial
- http://wiki.scipy.org/Numpy_Example_List#head-5f6f251729602559c6d59920aa1be7ab58dd9080
- http://blog.chinaunix.net/uid-21633169-id-4408596.html
- http://docs.scipy.org/doc/scipy/reference/tutorial/basic.html
1. Basics
Numpy包中array【是ndarray class的】要求有相同的类型,维数被称作axes,axes的number是rank(秩),它与 Standard Python Library中的class array不同【仅能处理一维array】,可处理多维。
name | decription |
---|---|
ndarray.ndim | array的axes【维数】 |
ndarry.shape | tuple整数,每一个dimension的size |
ndarray.size | array中的所有elemnts的个数 |
ndarray.dtype | array中elements的type |
ndarray.itemsize | array中每个element的size的byytes |
ndarray.data | buffer中包含的array中的实际的array |
examples:
from numpy import *
a = arange(15).reshape(3, 5)
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a.shape
Out[5]: (3, 5)
a.ndim
Out[6]: 2
a.dtype.name
Out[7]: 'int32'
a.itemsize
Out[8]: 4
a.size
Out[9]: 15
type(a)
Out[10]: numpy.ndarray
b = array([6, 7, 8])
b
Out[12]: array([6, 7, 8])
type(b)
Out[13]: numpy.ndarray
2. array的creation、printing、basic operations
(1)array的creation
a = array( [2, 3, 4] )
a
Out[15]: array([2, 3, 4])
a.dtype
dtype('int32')
a = array(1, 2, 3, 4) <strong>#会报错</strong>
a = array([1, 2, 3, 4])
a
Out[20]: array([1, 2, 3, 4])
b = array( [ (1.5, 2.3), (1.5, 6) ] )
b
array([[ 1.5, 2.3],
[ 1.5, 6. ]])
Out[22]:
File "<ipython-input-23-f0983fa3e19c>", line 1
Out[22]:
^
SyntaxError: invalid syntax
c = array( [ [1, 2], [3, 4] ], dtype=complex)
c
Out[25]:
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
zeros( (3, 4) )
Out[26]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
ones( (2, 3, 4), dtype=int16 )
Out[27]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=int16)
empty( (2, 3) )
Out[28]:
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
生成序列数值的数组,使用arange,当生成的数组是float型,使用步长值较不确定,可使用linspace接收elements的个数。
<pre name="code" class="python">arange( 10, 30, 5 )
Out[29]: array([10, 15, 20, 25])
arange( 0, 2, 0.3 )
Out[30]: array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
linspace( 0, 2, 9 )
Out[31]: array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
x = linspace( 0, 2*pi, 100 )
f = sin(x)
zeros_like:生成与已有的array同型状的值全为0的array
rand:生成随机数
fromfunction:根据已有的function,接受参数,生成对应规则的array
fromfile:从file中的data里面生成array
(2)array的print
设置array的print格式,可使用set_printoptions()函数
set_printoptions(precision=3, suppress=True)
x
Out[37]: array([ 3.142, 0. ])
(3)basic operations
数组运算,是对应的元素的运算
</pre><pre name="code" class="python"><pre name="code" class="python">from numpy import *
a = array( [20, 30, 40, 5] )
b = arange( 4 )
b
array([0, 1, 2, 3])
c = a-b
c
Out[7]: array([20, 29, 38, 2])
b**2
Out[8]: array([0, 1, 4, 9])
10*sin(a)
Out[9]: array([ 9.12945251, -9.88031624, 7.4511316 , -9.58924275])
a<35
Out[10]: array([ True, True, False, True], dtype=bool)
双目操作符可用于更改数组的值,而没有创建新的数组
精度处理时,低精度向高精度转换
统计操作
一般函数
import numpy as np
# print 'test'
B = np.arange(3)
print B
print np.exp(B)
print np.sqrt(B)
C = np.array([2., 1., 4.])
print np.add(B, C)
(4)Indexing、Slicing and Iterating
#################################
# one-dimensional arrays
#################################
a = arange(10)**3
print a
print a[2]
print a[2:5]
a[:6:2] = -1000
print a
# print a[ : : -1]
b = np.ones(10)
print b
b[::3] = 0
print b
c = np.ones(10)
print c
# c[0:1] = 0
c[0:2:2]=0
print c
d = np.arange(10)
print d
print d[0:5]
print d[0:5:2]
d[0:5:2] = 100
print d
print d[5:10]
print d[5:10:2]
d[5:10:2] = 99 #从第5个位置的元素算起,一直到第最后一个,步长 值为2,且第一个元素要被替换掉
print d
print d[1:7]
print d[7:1:-1] #当start > end的时候,step就为负
print d[7:1:-2]
#####################################
# Multidimensional arrays
#####################################
def f(x, y):
return 10*x + y
b = fromfunction(f, (5, 4), dtype = int)
print b
print b[2, 3]
print b[0:5, 1]
print b[0:4, 1]
print b[:, 1]
print b[1, :]
print b[-1] #从最后一个往前取,注意【正向的时候最小下标为0,铜币的时候为-1】
for row in b:
print row
3. shape的操作
import numpy as np
from numpy import arange
# print "test"
a = np.floor(10 * np.random.random((3, 4)))
print a
print a.ravel() #展平数组,按行来存储
a.shape = (6, 2)
print a.transpose() # 默认地是对数组进行转置, 可设置axis的值,对其进行变换
# reshape、transpose与resize
# resize 涉及到reference的问题
b = np.array([1, 2, 3, 4])
print b
b.resize(2, 2)
print b
b.resize(3, 2)
print b
b.resize(2, 4)
print b
b.resize(2, 1) # 丢弃年时若干元素来满足shape
print b
####################################
# 注意 reference的问题
####################################
c = np.array([5, 6, 7, 8])
d = c
d.resize(2, 2) #没有问题
print d
d.resize(2, 3) # 报错了,因d参照c了
print d
c.resize(2, 3) #报错了,因d参照c了
print c
# 不太明显的参照
e = arange(4)
print e
d.resize(5) #报错了,d参照了其他数组
print d
4. 将多个数组进行stack【叠加】或对单个数组进行split
import numpy as np
from numpy import newaxis, column_stack, vstack, hsplit
# print "test"
##############################
# 根据不同的axes,将array进行stack
##############################
a = np.floor(10 * np.random.random((2, 2)))
print a
b = np.floor(10 * np.random.random((2, 2)))
print b
print np.vstack((a, b)) # 垂直方向上进行stack
print np.hstack((a, b)) # 水平方向上进行stack
print np.column_stack((a, b)) #列上进行stack
c = np.array([4, 2])
print c
d = np.array([5, 6])
print d
print c[:, newaxis] #将一维数组转化为二维数组
print d[:, newaxis]
print column_stack((c[:, newaxis], d[:, newaxis]))
print vstack((c[:, newaxis], d[:, newaxis]))
#########################################
#对数组进行拆分
<pre name="code" class="python">#########################################
e = np.floor(10 * np.random.random((2, 12)))
print e
print np.hsplit(e, 3)
print np.hsplit(e, (3, 4))
5. 数组的copies与views
</pre><pre name="code" class="python">import numpy as np
# print "test"
#没有copy
a = np.arange(12)
print a
b = a # a与b是同一个ndarray object的两个不同名字
print b is a
b.shape = 3, 4
print a.shape
def f(x):
print id(x)
print id(a), id(b) #可以看到a.b的id是一样的
f(a)
f(b)
# view或浅拷贝
c = a.view()
print c
print c is a # 判断 c与a是同一个东西
print c.base is a #判断 c是a所拥有的的view
print c.flags.owndata
c.shape = 2, 6
print a.shape
print c
c[0, 4] = 1234 # c的数值改变影响到a的数据
print c
print a
s = a[:, 1:3]
print s
s[:] = 10 # s只是一个view
print s
print a
d = a.copy() #创建一个新array,并创建新data
print d is a # d与a没有共享任何东西
print d.base is a
d[0, 0] = 999
print d
print a # a没有受到d的任何影响
6. indexing
import numpy as np
# print "test"
a = np.arange(12) ** 2
print a
i = np.array( [1, 1, 3, 8, 5] )
print a[i]
j = np.array([[3, 4], [9, 7]]) # 返回的数组的形状与下标的相同
print a[j]
7. functions and Methods
(1)Array Creation
arrange:生成序列 arange(start, end)
array:创建数组
copy:复制数组
empty:创建并以随机生成初始值的数组
empty_like:创建与给定数组同形状但随机生成初始值的数组
eye:指定从第几列起开始生成1,其他列的数组所有的值均为0
fromfile:从文件中导入数据并生成数组
fromfunction:指定数组的形状,与位置有关的位置上的值,生成数组。
identity:生成单位矩阵形状的数组
linspace:生成指定个数的序列
logspace:logspace(-2, 3, num = 6)【from 10^(-2)到10^3】
mgrid:生成表格式的数组
omgrid:
ones:生成数组,初始值全为1
ones_like:生成与指定array同形状的数组,初始值全为1
r_ : 与arange(1,5)相同
zeros:生成数组,并初始化所有的值为0
zeros_like:生成与给定array同形状的数组,并用0进行初始化
(2)转化
astype:转化为某个type型的数据类型
atleast_1d:将给定的所有数组,output的arrays中的所有array的维数均大于等于1
atleast_2d:维数大于等于2
atleast_3d:维数大于等于3
mat:生成矩阵
(3)控制
array split: array拆分
column_stack:按列来重新组合多个array
concatenate:组合多介数组
diagonal:对角元素
dsplit:
dstack:以某个axis进行重新stack数据
hsplit:按水平轴进行拆分
hstack:按水平轴进行组合
item:取出数组中单个的值
newaxis:给array增加一个新的dimension
ravel:展来数组
repeat:指定数组中元素重复的次数,并生成新的数组
reshape:数组的形状或重新定义数组的形状
resize:重新更换数组的形状
squeeze:对数组进行压缩
swapaxes:将数组的axes进行变换
take:根据数组的下标来取出数组中对应的元素
transpose:对array进行转置操作
vsplit:垂直方向上进行拆分array
vstack:垂直方向上进行stack数组
(4)查询
all:判断array中的值是否全满足某一条件
any:判断是否存在
nonzero:判断为非0的array元素
where:查询满足某一条件的元素
(5)排序
argmax:返回数组中按某一标准来计算的参数值最大的下标
argmin:返回数组中按某一标准来计算的参数值最小的下标
argsort:对数组中的值按某一标准,选择某一排序方式进行排序
max: 返回数组中的最大值
min:返回数组中的最小值
ptp:最大值 - 最小值
searchsorted:查找按某一算法排序元素对应关系的位置
sort:排序,可指定按某一方式排序
(6)操作
choose:选择出array中对应位置上的某些元素
compress:按某些逻辑判断来取出对应的元素
cumprod:求出数组元素按某一条件的乘积
cumsum:求累和
inner:求两个array的内积
fill:将数据中的元素填充为某一个元素
imag:对应的复数进行操作,取数据中值为得数的部分
prod:求积
put:更改的元素的值,可指定下标
putmask:将数组下标换为逻辑表达式,用以更改数组中对应元素的值
real:对值为复数的数组,取其实数部分
sum:数组求和
(7)基本统计
cov:求协方差
mean:均值
std:标准差
var:方差
(8)线性关系
cross:求两数组的向量积
dot:矩阵求乘法
outer:外积
svd:
vdot:
8. 广播法则(rule)
广播法则能使通用函数有意义地处理不具有相同形状的输入。
广播第一法则是,如果所有的输入数组维度不都相同,一个“1”将被重复地添加在维度较小的数组上直至所有的数组拥有一样的维度。
广播第二法则确定长度为1的数组沿着特殊的方向表现地好像它有沿着那个方向最大形状的大小。对数组来说,沿着那个维度的数组元素的值理应相同。
应用广播法则之后,所有数组的大小必须匹配。
9. indexing
################################
# 下标为数组的数组
################################
a = np.arange(12) ** 2
print a
i = np.array( [ 1, 1, 3, 8, 5 ] )
print a[i]
j = np.array( [[3, 4], [9, 7]] )
print j
print a[j]
# 当下标数组是多维数组时
palette = np.array( [[0, 0, 0],
[255, 0, 0],
[0, 255, 0],
[0, 0, 255],
[255, 255, 255] ] )
print palette
image = np.array( [[0, 1, 2, 0],
[0, 3, 4, 0]] )
print image
print palette[image]
9. ix_()function
import numpy as np
# print "test"
a = np.array([2, 3, 4, 5])
print a
b = np.array([8, 5, 4])
print b
c = np.array([5, 4, 6, 8, 3])
print c
ax, bx, cx = np.ix_(a, b, c)
print ax, ax.shape
print bx, bx.shape
print cx, cx.shape
result = ax+bx*cx
print result
print result.shape
print result[3, 2, 4]
print a[3] + b[2]*c[4]
10. 线性代数
(1)简单的数组操作
import numpy as np
from numpy.linalg import *
# print "test"
a = np.array([[1., 2.], [3.,4.]])
print a
print a.transpose()
print inv(a)
u = np.eye(2)
print u
j = np.array([[0., -1.], [1., 0.]])
print np.dot(j, j)
print np.trace(u)
y = np.array([[5.], [7.]])
print y
print solve(a, y)
print eig(j)
(2)Matrix类
matrix实际上是一个2-d的数组
# Matrix Class
A = np.matrix('1.0 2.0; 3.0 4.0')
print A
print type(A)
print A.T # transpose
X = np.matrix('5.0 7.0')
print X
print X.shape
Y = X.T
print Y
print Y.shape
print A*Y
print A.I # inverse
print solve(A, Y)
Matrix的切片还是Matrix,但有个A属性,以数组呈现
Array的切片是Array
11. 小技巧
import numpy as np
# print "test"
a = np.arange(30)
print a
a.shape = 2, -1, 3 #为-1,根据数值的个数,自动匹配
print a
当两数组同形状时,可用vstack或hstack快速合并
x = np.arange(0, 10, 2)
y = np.arange(5)
print vstack([x, y])
print hstack([x, y])
直方图【histogram】与箱式图【bin】
12. 多项式操作(Polynomials)
一维多项式
import numpy as np
from sciPy import *
# print "test"
#####################
# shape manipulation
#####################
# Polynomial
p = np.poly1d([3, 4, 5])
print p
print p*p
print p(1)
print p(0.5)
13. 向量化(vectorize)
################################
# vectorize
################################
def addsubtract(a, b):
if a > b:
return a - b
else:
return a + b
vec_addsubtract = vectorize(addsubtract)
print vec_addsubtract([0, 3, 6, 9], [1, 3, 5, 7])