前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NumPy Beginner's Guide 2e 带注释源码

NumPy Beginner's Guide 2e 带注释源码

作者头像
ApacheCN_飞龙
发布2019-02-15 10:16:19
7580
发布2019-02-15 10:16:19
举报
文章被收录于专栏:信数据得永生信数据得永生
代码语言:javascript
复制
# 来源:NumPy Biginner's Guide 2e ch2
>>> from numpy import *

多维数组

代码语言:javascript
复制
# 创建多维数组
>>> m = array([arange(2), arange(2)])
>>> m
array([[0, 1],
       [0, 1]])
# 打印形状
>>> m.shape
(2, 2)

# 创建 2x2 的矩阵
>>> a = array([[1,2],[3,4]])
>>> a
array([[1, 2],
       [3, 4]])
       
# 读取矩阵的每个元素
>>> a[0,0]
1
>>> a[0,1]
2
>>> a[1,0]
3
>>> a[1,1]
4

数值类型

类型

描述

bool

布尔值,一位

int

平台相关整数,int32或int64

int8

字节(-128 ~ 127)

int16

整数(-32768 ~ 32767)

int32

整数(-2 ** 31 ~ 2 ** 31 - 1)

int64

整数(-2 ** 63 ~ 2 ** 63 - 1)

uint8

无符号整数(0 ~ 255)

uint16

无符号整数(0 ~ 65535)

uint32

无符号整数(0 ~ 2 ** 32 - 1)

uint64

无符号整数(0 ~ 2 ** 64 - 1)

float16

半精度浮点,符号位,5 位指数,10 位尾数

float32

单精度浮点,符号位,8 位指数,23 位尾数

float64或float

双精度浮点,符号位,11 位指数,52 位尾数

complex64

复数,由两个 32 位浮点表示(实部和虚部)

complex128或complex

复数,由两个 64 位浮点表示(实部和虚部)

代码语言:javascript
复制
# 每个数据类型都可用作转换函数
>>> 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)

代码语言:javascript
复制
# 从数值类型构造
>>> 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.itemsize
8

# 许多函数拥有 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

记录类型

代码语言:javascript
复制
# 定义记录类型
# dtype 传入字段列表,字段用名称和类型表示
>>> t = dtype([('name', str_, 40), ('numitems', int32), ('price', float32)])
>>> t
dtype([('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)

操作形状

代码语言:javascript
复制
>>> 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)
>>> 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]])

# 用于转置矩阵
>>> 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))
>>> 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]])

堆叠

代码语言:javascript
复制
>>> a = arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> b = 2 * a
>>> b
array([[ 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)
>>> oned
array([0, 1])
>>> twice_oned = 2 * oned
>>> twice_oned
array([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)

分割

代码语言:javascript
复制
>>> a
array([[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)
>>> c
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],
        [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]]])]

属性

代码语言:javascript
复制
# ndim 获取数组维度
>>> 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]])
>>> b.ndim
2

# size 获取元素数量
>>> b.size
24

# itemsize 获取元素大小
>>> b.itemsize
8

# 这两个乘起来就是数组的大小 nbytes
>>> b.nbytes
192
>>> b.size * b.itemsize
192

# T 属性用于获取转置,和 tranpose 函数一样
>>> b.resize(6,4)
>>> 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]])
>>> b.T
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]])
       
# 但如果数组是一维的,我们只能得到它的视图
>>> b.ndim
1
>>> b.T
array([0, 1, 2, 3, 4])

# NumPy 中的复数用 j 表示
>>> b = array([1.j + 1, 2.j + 3])
>>> b
array([ 1.+1.j,  3.+2.j])
>>> b.dtype
dtype('complex128')
>>> b.dtype.str
'<c16'

# real 用于获取实部
>>> b.real
array([ 1.,  3.])

# imag 用于获取虚部
>>> b.imag
array([ 1.,  2.])

# flat 属性获取 numpy.flatiter 对象,它是一个迭代器,用于遍历所有元素
>>> b = arange(4).reshape(2,2)
>>> b
array([[0, 1],
       [2, 3]])
>>> f = b.flat
>>> f
<numpy.flatiter object at 0x103013e00>
>>> for item in f: print item
0
1
2
3

# 也可以直接索引 flatiter 对象
>>> b.flat[2]
2

# 或者多个元素
>>> b.flat[[1,3]]
array([1, 3])

# flat 属性是可设置的,修改 flat 属性的值会修改原始数组
# 设置所有元素
>>> b.flat = 7
>>> b
array([[7, 7],
       [7, 7]])
# 或者仅仅设置某个元素
>>> b.flat[[1,3]] = 1
>>> b
array([[7, 1],
       [7, 1]])

转换

代码语言:javascript
复制
# 转换为 Python 列表
>>> b
array([ 1.+1.j,  3.+2.j])
>>> b.tolist()
[(1+1j), (3+2j)]

# astype 转换数组中的元素类型
# 复数转为整数时会丢掉虚部
>>> b
array([ 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/python
array([1, 3])
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年05月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多维数组
  • 数值类型
  • 数据类型对象(dtype)
  • 记录类型
  • 操作形状
  • 堆叠
  • 分割
  • 属性
  • 转换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档