numpy中的数组类型为ndarry
创建
# -*- coding: utf-8 -*-
import numpy as np
#用列表或元组创建
a = np.array([[1,2,3],[4,5,6
]])
b = np.array([1,2],dtype=
complex)
#类似内置函数range #range(start, end, step),返回一个list对象,起始值为start,终止值为end,但不含终止值,步长为step。只能创建int型list。
arange(start, end, step),与range()类似,但是返回一个array对象。需要引入import numpy as np,并且arange可以使用float型数据。
c = np.arange(24).reshape(2,3,4
) #reshape定义数组形状,最小的数组有4个元素,由3个4元素组成一组,再由两个这样组,组成一大组,范围逐渐扩大。
#等差,等比数组
d = np.linspace(0,1,10,endpoint=
False)
print np.logspace(0,4,3,base=2
)
#创建特殊数组
print np.zeros((2,3
))
print np.zeros_like(a)
print np.ones((2,3),dtype=np.int16)
#全1
print np.empty((2,3
))
print np.eye(3)
#单位阵
#从字符串,函数,文件等创建
s =
'abcdef'
print np.fromstring(s,dtype=
np.int8)
print np.fromfunction(
lambda i,j:(i+1)*(j+1), (9,9
))
#fromfile从二进制文件中创建,tofile写入文件
#从文件创建
np.savetxt(
'123.txt',a)
#存为文本
e = np.loadtxt(
'123.txt')
#文件操作还有savez,save,load
np.save(
'c.npy', c)
#存为二进制,后缀不可变
c = np.load(
'c.npy')
print c
np.savez('c.npz', c,d)
#存储多个数组
d = np.load(
'c.npz')
print d[
'arr_0'], d[
'arr_1']
c.tofile('c.bin')
c = np.fromfile(
'c.bin',dtype=np.int32)
#读出来是一维的
print c
#创建随机数组
print np.random.random((2,3
))
#结构体数组
persontype = np.dtype({
'names':[
'name',
'age',
'weight'],
'formats':[
'S30',
'i',
'f']}, align=
True)
f = np.array([(
'zhang',32,75.5), (
'wang',24,65.2)], dtype=
persontype)
print f
print f[
'name']
print f[0][
'age']
属性
# -*- coding: utf-8 -*-
import numpy as np
a = np.array([[1,2,3],[4,5,6
]])
print a.ndim
#维数
print a.shape
#(3,2) 每个维数的长度
print a.size
#元素个数
print a.dtype
#float64,元素类型.所有类型可通过set(np.typeDict.values())查看
print a.itemsize
#每个元素的字节数
print a.data
#缓冲区地址
使用
# -*- coding: utf-8 -*-
import numpy as np
a = np.array([[1,2,3],[4,5,6
]])
print a[1][2
]
index = (1,2
)
print a[index]
print a[0:2,1
]
print a[:,[0,2]]
#取第0和2列
print a[1
]
print a[...,1
]
for row
in a:
print row
for element
in a.flat:
print element
b = a>4
a[b] =
0
print a
操作
# -*- coding: utf-8 -*-
import numpy as np
a = np.array([[1,2,3],[4,5,6
]])
#改变大小
a.ravel()
#展平为1维数组
print a
a.shape = (3,2)
#元素在内存中的位置并没有改变
print a.reshape(2,-1)
#a不动,返回改变形状后的数组,-1对应的维自动计算
a.resize((2,3
))
print a
#组合
b = np.floor(10*np.random.random((2,3
)))
print np.vstack((a,b))
print np.hstack((a,b))
#类似还有concatenate, r_, c_
#分割
print np.hsplit(a,3
)
#复制
c = a
#c跟a完全相同
print c
is a
c = a.view()
#c跟a虽是不同数组,但c跟a公用数据.
c = a.copy()
#深拷贝,c跟a完全不同
print a.repeat(3,axis=
0)
a = np.array([1,2,3,4,5
])
b = np.array([2,4,7
])
ax,bx =
np.ix_(a,b)
print ax.shape
print ax*
bx
#产生能快速广播的数组
x,y = np.ogrid[:1:4j, :1:3j]
#和arange类似,三个产生是开始值,结束值,步长,步长为虚数表示长度
print x
print y
print 2*x +
y
x,y = np.mgrid[:1:4j, :1:3j]
#与ogrid不同的是,它返回的是广播后的数组
print x
print y
运算
# -*- coding: utf-8 -*-
import numpy as np
a = np.array([[4,3],[2,1
]])
b = np.array([[1,1],[0,1
]])
#逻辑运算
print np.logical_or(a==b, a<
b)
print np.any(a==
b)
print np.all(a>
b)
#对每个元素操作
print a<3
print a**2
print a*
b
a *= 3
np.add(a,b,a)
print a
#通用函数
print np.exp(a)
print np.sort(a)
#对每行排序
'''
当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组的形状相同。如果形状不同,会进行如下的广播(broadcasting)处理:
1. 让所有输入数组都向其中维数最多的数组看齐,shape属性中不足的部分都通过在前面加1补齐。
2. 输出数组的shape属性是输入数组的shape属性的各个轴上的最大值。
3. 如果输入数组的某个轴的长度为1或与输出数组的对应轴的长度相同时,这个数组能够用来计算,否则出错。
4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。
'''
#将a视为1维数组
print a.max()
#a.func()等同于np.func(a)
print a.argmin()
print a.sum()
#以下4个为统计函数
print a.mean()
print a.var()
print a.std()
print np.cov(a)
#也可以对指定的维操作,例如
print a.sum(axis=
0)
print np.add.reduce(a,axis=1
)
print np.add.accumulate(a,axis=1)
#于reduce不同的是它保留中间结果
print np.inner(a,a)
#计算两个数组最后1维的内积
print np.multiply.outer([1,2,3,4,5],[2,3,4])
#先使第一个参数的shape变为(5,1),再multiply,再执行squeeze剔除长度为1的轴
线性代数
# -*- coding: utf-8 -*-
import numpy as np
import numpy.matlib
a = np.array([[1.,2.],[3.,4
.]])
b = np.array([[1,1],[0,1
]])
print a.transpose()
print np.trace(a)
print a.trace()
print np.linalg.det(a)
print np.linalg.eig(a)
#特征向量和特征值
print np.dot(a,b)
#矩阵乘法
#解方程组
y = np.array([[5.],[7
,]])
print np.linalg.solve(a,y)
#linalg更多函数见http://docs.scipy.org/doc/numpy/reference/routines.linalg.html
#矩阵类继承自2维数组
A =
np.mat(a)
print A.T
print A.I
X = np.matrix(
'5 6; 7 8').T
print A*
X
print A[:,1]
#跟数组不一样,这里切片的结果还是矩阵
print numpy.matlib.identity(3,dtype=int)
#单位阵