1 概览
用来处理大型矩阵,运算效率比列表更高效。
轴:维度
秩:轴的个数
如:[[1,0,0],[0,1,2]] ,秩为2,第一个维度长度为2,第二个维度长度为3
ndarray
numpy的数组类,numpy.array 不同于 python库类array.array,后者只处理一维数组
对象属性
- ndarray.ndim:秩
- ndarray.shape:维度,如n排m列的矩阵,shape属性为(2,3),指示每个维度上的大小
- ndarray.size:数组元素的总个数,2*3
- ndarray.dtype:描述数组中元素类型的对象
- ndarray.itemsize:数组中每个元素的字节大小,如float:8
- ndarray.data:不常用
import numpy as np
data=[1,2,3,4,5]
array1=np.array(data)
print(array1)
#输出 [1,2,3,4,5]
#array1: array([1,2,3,4,5])
嵌套列表会被转换为一个多维数组,也被称为矩阵
data=[[1,3,4],[2,5,6]]
array=np.array(data)
print(array)
#输出
[[1,3,4],
[2,5,6]]
#array([[1,3,4],[2,5,6]])
2 创建数组
array()函数
a=array([2,3,4]):从列表推导来
a=array([(1.5,2,3),(4,5,6)]):从序列包含序列得来
注意:只能由数值组成的列表作为一个参数,错误:b=array(1,2,3)
zero():创建全是0的数组
zero((3,4))
## array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
ones():创建全1的数组
ones((2,3,4),dtype=int16)
##
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():创建内容随机,默认float型
empty((2,3))
##
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
arrange():创建数列,返回数组而不是列表
arrane(10,30,5)
##输出
array([10,15,20,25)]
3 打印数组
NumPy以类似嵌套列表的形式显示它,但是呈以下布局:
- 最后的轴从左到右打印
-次后的轴从顶向下打印 - 剩下的轴从顶向下打印,每个切片通过一个空行与下一个隔开
- 一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
b=arrange(12).reshape(4,3)
print(b)
##
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
c = arange(24).reshape(2,3,4) # 3d array
print (c)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
(注意哦,打印时没有逗号分隔,如果输出对象形式array([])时是有逗号的。。。)
4 基本运算
数组的基本运算是按元素的,比如注意
a=array(20,30,40,50)
a<35
##
array([ True, True, False, False], dtype=bool)
注意: *是指按元素计算,dot()才是矩阵乘法
//*
A=array( [[ 1,1],
[ 0,1]] )
B=array( [[ 2,0],
[[3,4])
A*B
array([[ 2,0 ],
[0,4])
//dot()
dot(A,B)
array([[5, 4],
[3, 4]])
当运算的是不同类型的数组时,和其它语言一样处理
许多非数组运算,被作为ndarray类的方法实现,如a.sum(), a.min(), a.max(), 它们无关数组的形状,被当作数字组成 的列表。指定axis,可以把运算应用到数组指定的轴上
b = arange(12).reshape(3,4)
b
##
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
b.sum(axis=0)
##
array([12, 15, 18, 21])
5 通用函数ufunc
数学函数sin,cos,exp等,作用于数组元素,产生一个数组作为输出
6 索引,切片和迭代
http://blog.csdn.net/liangzuojiayi/article/details/51534164
形状操作
由它每个轴上的元素个数给出:
a = floor (10*random.random((3,4)))
a
##
array([[ 6., 7., 4., 3.],
[ 0., 0., 2., 6.],
[ 7., 7., 8., 6.]])
a.shape
##
(3,4)
修改
a.ravel() //flatten the array
## array([ 6., 7., 4., 3., 0., 0., 2., 6., 7., 7., 8., 6.])
a.shape=(6,2)
a.transpose()
##
array([[ 6., 4., 0., 2., 7., 8.],
[ 7., 3., 0., 6., 7., 6.]])
a.resize((2,6))
##
array([[ 6., 7., 4., 3., 0., 0.],
[ 2., 6., 7., 7., 8., 6.]])
组合
vstack():纵向合并
hstack():横向合并
分割
hsplit:沿水平轴分割,或返回相同形状数组的个数,或指定在哪些列后发生分割
vsplit:沿纵向轴分割
array([[ 3., 7., 0., 6., 0., 6., 8., 5., 8., 2., 7., 1.],
[ 7., 7., 2., 3., 4., 8., 8., 5., 2., 5., 5., 4.]])
hsplit(a,3)
##
[array([[ 3., 7., 0., 6.],
[ 7., 7., 2., 3.]]), array([[ 0., 6., 8., 5.],
[ 4., 8., 8., 5.]]), array([[ 8., 2., 7., 1.],
[ 2., 5., 5., 4.]])]
hsplit(a,(3,4))
##
[array([[ 3., 7., 0.],
[ 7., 7., 2.]]), array([[ 6.],
[ 3.]]), array([[ 0., 6., 8., 5., 8., 2., 7., 1.],
[ 4., 8., 8., 5., 2., 5., 5., 4.]])]
复制和视图
浅复制
赋值:对原数组有影响
视图:不影响
c = a.view()
c.shape=2,6
a.shape //shape doesn't change
##
(3,4)
c[0,4] = 1234
a
##
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]]) //data change
深复制
d = a.copy()
d[0,0]=9999
//对a不会有影响