Python学习笔记(15)

结构化数组

假设要保存这样的数据

nameagewgt
0dan123.1
1ann025.1
2sam28.3

首先定义一个人的结构类型

person_dtype = np.dtype([('name', 'S10'), ('age', 'int'), ('weight', 'float')])

然后构建一个3x4的空结构体数组:

people = np.empty((3,4), person_dtype)

分别赋值

people['name'] = [['Brad', 'Jane', 'John', 'Fred'],
                  ['Henry', 'George', 'Brain', 'Amy'],
                  ['Ron', 'Susan', 'Jennife', 'Jill']]
people['age'] = [[33, 25, 47, 54],
                 [29, 61, 32, 27],
                 [19, 33, 18, 54]]
people['weight'] = [[135., 105., 255., 140.],
                    [154., 202., 137., 187.],
                    [188., 135., 88., 145.]]

当然还可以 从文本中读取结构化数组

person_dtype = np.dtype([('name', 'S10'), ('age', 'int'), ('weight', 'float')])

people = np.loadtxt('people.txt', 
                    skiprows=1,
                    dtype=person_dtype)

people

所以结构化数组的关键在于我们如何去看待去解释这段内存
你的自定义dtype是什么

嵌套类型

有时候,结构数组中的域可能包含嵌套的结构,例如,在我们希望在二维平面上纪录一个质点的位置和质量:

positionmass
x y

那么它的类型可以这样嵌套定义:

particle_dtype = np.dtype([('position', [('x', 'float'), 
                                         ('y', 'float')]),
                           ('mass', 'float')
                          ])
 data = np.loadtxt('data.txt', dtype=particle_dtype)
 

array 还是 matrix?

Numpy 中不仅提供了 array 这个基本类型,还提供了支持矩阵操作的类 matrix,但是一般推荐使用 array:

很多 numpy 函数返回的是 array,不是 matrix
在 array 中,逐元素操作和矩阵操作有着明显的不同
向量可以不被视为矩阵
具体说来:

  • , dot(), multiply()
    array:
    -逐元素乘法,dot() -矩阵乘法
    matrix:* -矩阵乘法,multiply() -逐元素乘法
  • 处理向量
    array:形状为 1xN, Nx1, N 的向量的意义是不同的,类似于 A[:,1] 的操作返回的是一维数组,形状为 N,一维数组的转置仍是自己本身
    matrix:形状为 1xN, Nx1,A[:,1] 返回的是二维 Nx1 矩阵
  • 高维数组
    array:支持大于2的维度
    matrix:维度只能为2
  • 属性
    array:.T 表示转置
    matrix:.H 表示复共轭转置,.I 表示逆,.A 表示转化为 array 类型
  • 构造函数
    array:array 函数接受一个(嵌套)序列作为参数——array([[1,2,3],[4,5,6]])
    matrix:matrix 函数额外支持字符串参数——matrix("[1 2 3; 4 5 6]")

其优缺点各自如下:

  • 项目

    • 项目
      • 项目
  • array

    • [GOOD] 一维数组既可以看成列向量,也可以看成行向量。v 在 dot(A,v) 被看成列向量,在 dot(v,A) 中被看成行向量,这样省去了转置的麻烦
    • [BAD!] 矩阵乘法需要使用 dot() 函数,如: dot(dot(A,B),C) vs ABC
    • [GOOD] 逐元素乘法很简单: A*B
    • [GOOD] 作为基本类型,是很多基于 numpy 的第三方库函数的返回类型
    • [GOOD] 所有的操作 *,/,+,**,… 都是逐元素的
    • [GOOD] 可以处理任意维度的数据
    • [GOOD] 张量运算
  • matrix

    • [GOOD] 类似与 MATLAB 的操作
    • [BAD!] 最高维度为2
    • [BAD!] 最低维度也为2
    • [BAD!] 很多函数返回的是 array,即使传入的参数是 matrix
    • [GOOD] A*B 是矩阵乘法
    • [BAD!] 逐元素乘法需要调用 multiply 函数
    • [BAD!] / 是逐元素操作
      当然在实际使用中,二者的使用取决于具体情况。

二者可以互相转化:

  • asarray :返回数组
  • asmatrix(或者mat) :返回矩阵
  • asanyarray :返回数组或者数组的子类,注意到矩阵是数组的一个子类,所以输入是矩阵的时候返回的也是矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值