NumPy 基础入门

来源:互联网 发布:淘宝怎样隐藏订单 编辑:程序博客网 时间:2024/05/29 14:01

NumPy 基础入门

# 来源:NumPy Biginner's Guide 2e ch2>>> from numpy import *

多维数组

# 创建多维数组>>> m = array([arange(2), arange(2)])>>> marray([[0, 1],       [0, 1]])# 打印形状>>> m.shape(2, 2)# 创建 2x2 的矩阵>>> a = array([[1,2],[3,4]])>>> aarray([[1, 2],       [3, 4]])# 读取矩阵的每个元素>>> a[0,0]1>>> a[0,1]2>>> a[1,0]3>>> a[1,1]4

数值类型

类型 描述 bool 布尔值,一位 int 平台相关整数,int32int64 int8 字节(-128 ~ 127int16 整数(-32768 ~ 32767int32 整数(-2 ** 31 ~ 2 ** 31 - 1int64 整数(-2 ** 63 ~ 2 ** 63 - 1uint8 无符号整数(0 ~ 255uint16 无符号整数(0 ~ 65535uint32 无符号整数(0 ~ 2 ** 32 - 1uint64 无符号整数(0 ~ 2 ** 64 - 1float16 半精度浮点,符号位,5 位指数,10 位尾数 float32 单精度浮点,符号位,8 位指数,23 位尾数 float64float 双精度浮点,符号位,11 位指数,52 位尾数 complex64 复数,由两个 32 位浮点表示(实部和虚部) complex128complex 复数,由两个 64 位浮点表示(实部和虚部)
# 每个数据类型都可用作转换函数>>> float64(42)42.0>>> int8(42.0)42>>> bool(42)True>>> bool(0)False>>> bool(42.0)True>>> float(True)1.0>>> float(False)0.0# 复数转整数会抛出错误>>> int(42.0 + 1.j)Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: can't convert complex to int

数据类型对象(dtype)

# 从数值类型构造>>> dtype(float)dtype('float64')# 从字符代码构造>>> dtype('f')dtype('float32')>>> dtype('d')dtype('float64')# 从双字符代码构造>>> dtype('f8')dtype('float64')# 获取所有字符代码>>> sctypeDict.keys()[0, … 'i2', 'int0']# char 属性获取字符代码>>> t = dtype('Float64')>>> t.char'd'# type 属性获取类型>>> t.type<type 'numpy.float64'># str 属性获取完整字符串表示# 第一个字符是字节序,< 表示小端,> 表示大端,| 表示平台的字节序>>> t.str'<f8'# 获取大小>>> t.itemsize8# 许多函数拥有 dtype 参数# 传入数值类型、字符代码和 dtype 都可以>>> arange(7, dtype=uint16)array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)
类型 字符代码 bool ?, b1 int8 b, i1 uint8 B, u1 int16 h, i2 uint16 H, u2 int32 i, i4 uint32 I, u4 int64 q, i8 uint64 Q, u8 float16 f2, e float32 f4, f float64 f8, d complex64 F4, F complex128 F8, D str S(可以在S后面添加数字,表示字符串长度,比如S3表示长度为三的字符串,不写则为最大长度) unicode U object O void V

记录类型

# 定义记录类型# dtype 传入字段列表,字段用名称和类型表示>>> t = dtype([('name', str_, 40), ('numitems', int32), ('price', float32)])>>> tdtype([('name', '|S40'), ('numitems', '<i4'), ('price','<f4')])# 获取字段>>> t['name']dtype('|S40')# 使用记录类型创建数组# 否则它会把记录拆开>>> itemz = array([('Meaning of life DVD', 42, 3.14), ('Butter', 13,2.72)], dtype=t)>>> itemz[1]('Butter', 13, 2.7200000286102295)

操作形状

>>> b = array([[[ 0,  1,  2,  3],                [ 4,  5,  6,  7],                [ 8,  9, 10, 11]],               [[12, 13, 14, 15],                [16, 17, 18, 19],                [20, 21, 22, 23]]])# ravel 将数组展开,创建视图>>> b.ravel()array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,14, 15, 16,       17, 18, 19, 20, 21, 22, 23])# flatten 将数组展开,创建副本>>> b.flatten()array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,14, 15, 16,       17, 18, 19, 20, 21, 22, 23])# reshape 用于设置数组形状# 总数必须一致>>> b.shape = (6,4)>>> barray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15],       [16, 17, 18, 19],       [20, 21, 22, 23]])# 用于转置矩阵>>> b.transpose()array([[ 0,  4,  8, 12, 16, 20],       [ 1,  5,  9, 13, 17, 21],       [ 2,  6, 10, 14, 18, 22],       [ 3,  7, 11, 15, 19, 23]])# resize 用于原地设置形状# 其它和 reshape 相同>>> b.resize((2,12))>>> barray([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])

堆叠

>>> a = arange(9).reshape(3,3)>>> aarray([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])>>> b = 2 * a>>> barray([[ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])# 二维数组的轴# 0:竖直,1:水平# 三维数组的轴# 0:纵深,1:竖直,2:水平# 水平堆叠>>> hstack((a, b))array([[ 0,  1,  2,  0,  2,  4],       [ 3,  4,  5,  6,  8, 10],       [ 6,  7,  8, 12, 14, 16]])# 也可以使用 concatenate,指定轴 1(二维数组的水平轴)>>> concatenate((a, b), axis=1)array([[ 0,  1,  2,  0,  2,  4],       [ 3,  4,  5,  6,  8, 10],       [ 6,  7,  8, 12, 14, 16]])# 竖直堆叠>>> vstack((a, b))array([[ 0,  1,  2],       [ 3,  4,  5],       [ 6,  7,  8],       [ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])# 也可以使用 concatenate,指定轴 0(二维数组的数值轴,默认值)>>> concatenate((a, b), axis=0)array([[ 0,  1,  2],       [ 3,  4,  5],       [ 6,  7,  8],       [ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])# 纵深堆叠# 沿第三个轴(深度)堆叠>>> dstack((a, b))array([[[ 0,  0],        [ 1,  2],        [ 2,  4]],       [[ 3,  6],        [ 4,  8],        [ 5, 10]],       [[ 6, 12],        [ 7, 14],        [ 8, 16]]])# 按列堆叠# 对于一维数组,column_stack 使一维数组变成二维数组的列>>> oned = arange(2)>>> onedarray([0, 1])>>> twice_oned = 2 * oned>>> twice_onedarray([0, 2])>>> column_stack((oned, twice_oned))array([[0, 0],       [1, 2]])# 对于二维数组,就是 hstack>>> column_stack((a, b))array([[ 0,  1,  2,  0,  2,  4],       [ 3,  4,  5,  6,  8, 10],       [ 6,  7,  8, 12, 14, 16]])>>> column_stack((a, b)) == hstack((a, b))array([[ True,  True,  True,  True,  True,  True],       [ True,  True,  True,  True,  True,  True],       [ True,  True,  True,  True,  True,  True]], dtype=bool)# 按行堆叠# 对于一维数组,row_stack 使一维数组变成二维数组的行>>> row_stack((oned, twice_oned))array([[0, 1],       [0, 2]])# 对于二维数组,就是 vstack>>> row_stack((a, b))array([[ 0,  1,  2],       [ 3,  4,  5],       [ 6,  7,  8],       [ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])>>> row_stack((a,b)) == vstack((a, b))array([[ True,  True,  True],       [ True,  True,  True],       [ True,  True,  True],       [ True,  True,  True],       [ True,  True,  True],       [ True,  True,  True]], dtype=bool)

分割

>>> aarray([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])# 水平分割,指明分割为多少块# 不能均分时报错>>> hsplit(a, 3)[array([[0],       [3],       [6]]), array([[1],       [4],       [7]]), array([[2],       [5],       [8]])]# 也可以使用 split 函数指定轴 1(二维数组的水平轴)>>> split(a, 3, axis=1)[array([[0],       [3],       [6]]), array([[1],       [4],       [7]]), array([[2],       [5],       [8]])]# 竖直分割,指明分割为多少块# 不能均分时报错>>> vsplit(a, 3)[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7,8]])]# 也可以使用 split 函数指定轴 0(二维数组的竖直轴)>>> split(a, 3, axis=0)[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7,8]])]# 纵深分割# 我们需要一个三维数组>>> c = arange(27).reshape(3, 3, 3)>>> carray([[[ 0,  1,  2],        [ 3,  4,  5],        [ 6,  7,  8]],       [[ 9, 10, 11],        [12, 13, 14],        [15, 16, 17]],       [[18, 19, 20],        [21, 22, 23],        [24, 25, 26]]])>>> dsplit(c, 3)[array([[[ 0],        [ 3],        [ 6]],       [[ 9],        [12],        [15]],       [[18],        [21],        [24]]]), array([[[ 1],        [ 4],        [ 7]],       [[10],        [13],        [16]],       [[19],        [22],        [25]]]), array([[[ 2],        [ 5],        [ 8]],       [[11],        [14],        [17]],       [[20],        [23],        [26]]])]

属性

# ndim 获取数组维度>>> barray([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])>>> b.ndim2# size 获取元素数量>>> b.size24# itemsize 获取元素大小>>> b.itemsize8# 这两个乘起来就是数组的大小 nbytes>>> b.nbytes192>>> b.size * b.itemsize192# T 属性用于获取转置,和 tranpose 函数一样>>> b.resize(6,4)>>> barray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15],       [16, 17, 18, 19],       [20, 21, 22, 23]])>>> b.Tarray([[ 0,  4,  8, 12, 16, 20],       [ 1,  5,  9, 13, 17, 21],       [ 2,  6, 10, 14, 18, 22],       [ 3,  7, 11, 15, 19, 23]])# 但如果数组是一维的,我们只能得到它的视图>>> b.ndim1>>> b.Tarray([0, 1, 2, 3, 4])# NumPy 中的复数用 j 表示>>> b = array([1.j + 1, 2.j + 3])>>> barray([ 1.+1.j,  3.+2.j])>>> b.dtypedtype('complex128')>>> b.dtype.str'<c16'# real 用于获取实部>>> b.realarray([ 1.,  3.])# imag 用于获取虚部>>> b.imagarray([ 1.,  2.])# flat 属性获取 numpy.flatiter 对象,它是一个迭代器,用于遍历所有元素>>> b = arange(4).reshape(2,2)>>> barray([[0, 1],       [2, 3]])>>> f = b.flat>>> f<numpy.flatiter object at 0x103013e00>>>> for item in f: print item0123# 也可以直接索引 flatiter 对象>>> b.flat[2]2# 或者多个元素>>> b.flat[[1,3]]array([1, 3])# flat 属性是可设置的,修改 flat 属性的值会修改原始数组# 设置所有元素>>> b.flat = 7>>> barray([[7, 7],       [7, 7]])# 或者仅仅设置某个元素>>> b.flat[[1,3]] = 1>>> barray([[7, 1],       [7, 1]])

转换

# 转换为 Python 列表>>> barray([ 1.+1.j,  3.+2.j])>>> b.tolist()[(1+1j), (3+2j)]# astype 转换数组中的元素类型# 复数转为整数时会丢掉虚部>>> barray([ 1.+1.j,  3.+2.j])>>> b.astype(int)/usr/local/bin/ipython:1: ComplexWarning: Casting complex values to real discards the imaginary part  #!/usr/bin/pythonarray([1, 3])
原创粉丝点击