numpy学习笔记(3)

八 广播

当使用ufunc函数对两个数组进行运算的时候,ufunc会对两个数组中两个对应函数进行运算,因此要求两个数组有大小相同的shape,如果两个数组的shape不同的话,会进行如下的广播处理:

  1. 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
  2. 输出数组的shape是输入数组shape的各个轴上的最大值
  3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
  4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值
array([[ 0],
       [10],
       [20],
       [30],
       [40],
       [50]])
>>> b = arange(0,5)
>>> b
array([0, 1, 2, 3, 4])
>>> a.shape
(6, 1)
>>> b.shape
(5,)
>>> print a + b
[[ 0  1  2  3  4]
 [10 11 12 13 14]
 [20 21 22 23 24]
 [30 31 32 33 34]
 [40 41 42 43 44]
 [50 51 52 53 54]]
上述计算步骤是

1,根据1把b.shape变为(1,5)

2.根据2把a.shape和 b.shape变为(6.5)之后在相加

ogrid对象

ogrid对象是一个非常有用的对象,它像一个多维数组一样,用切片组元作为下标进行存取,返回的是一组可以用来广播计算的数组,其切片下标有两种形式,

  • 开始值:结束值:步长,和np.arange(开始值, 结束值, 步长)类似

  • 开始值:结束值:长度j,当第三个参数为虚数时,它表示返回的数组的长度,和np.linspace(开始值, 结束值, 长度)类似

利用ogrid的返回值,我能很容易计算x, y网格面上各点的值,或者x, y, z网格体上各点的值。下面是绘制三维曲面 x * exp(x**2 - y**2) 的程序:

import numpy as np
from enthought.mayavi import mlab

x, y = np.ogrid[-2:2:20j, -2:2:20j]
z = x * np.exp( - x**2 - y**2)

pl = mlab.surf(x, y, z, warp_scale="auto")
mlab.axes(xlabel='x', ylabel='y', zlabel='z')
mlab.outline(pl)

九 数组的形状操作

1.更改数组的形状

>>> a = arange(9)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> b = a.reshape(3,-1)   #不改变自己形状
>>> b
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a.resize(3,3)   #改变自己形状
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

更多 shape, reshape, resize, ravel

2.组合不同的数组

>>> a = arange(4).reshape(2,-1)
>>> a
array([[0, 1],
       [2, 3]])
>>> b = a.copy()
>>> b
array([[0, 1],
       [2, 3]])
>>> c = vstack((a,b))
>>> c
array([[0, 1],
       [2, 3],
       [0, 1],
       [2, 3]])
>>> d = hstack((a,b))
>>> d
array([[0, 1, 0, 1],
       [2, 3, 2, 3]])

vstack和hstack将两数组从不同轴组合数组

更多函数hstack , vstack, column_stack , row_stack , concatenate , c_ , r_

3,将一个数组分割成几个数组

>>> a = floor(10*random.random((2,12)))
>>> a
array([[ 8.,  8.,  3.,  9.,  0.,  4.,  3.,  0.,  0.,  6.,  4.,  4.],
       [ 0.,  3.,  2.,  9.,  6.,  0.,  4.,  5.,  7.,  5.,  1.,  4.]])
>>> hsplit(a,3)   # Split a into 3
[array([[ 8.,  8.,  3.,  9.],
       [ 0.,  3.,  2.,  9.]]), array([[ 0.,  4.,  3.,  0.],
       [ 6.,  0.,  4.,  5.]]), array([[ 0.,  6.,  4.,  4.],
       [ 7.,  5.,  1.,  4.]])]
vsplit沿着纵向的轴分割, array split允许指定沿哪个轴分割。

十 矩阵

1.矩阵的创建

class numpy.matrix(data,dtype,copy):返回一个矩阵,其中data为ndarray对象或者字符形式;dtype:为data的type;copy:为bool类型

>>> a = np.matrix('1 2 7; 3 4 8; 5 6 9')
>>> a             #矩阵的换行必须是用分号(;)隔开,内部数据必须为字符串形式(‘ ’),矩
matrix([[1, 2, 7],       #阵的元素之间必须以空格隔开。
[3, 4, 8],
[5, 6, 9]])

>>> b=np.array([[1,5],[3,2]])
>>> x=np.matrix(b)   #矩阵中的data可以为数组对象。
>>> x
matrix([[1, 5],
[3, 2]])

2.矩阵的属性

matrix.T transpose:返回矩阵的转置矩阵
matrix.H hermitian (conjugate) transpose:返回复数矩阵的共轭元素矩阵
matrix.I inverse:返回矩阵的逆矩阵
matrix.A base array:返回矩阵基于的数组

3.矩阵运算

>>> a = matrix([1,2,3])
>>> a
matrix([[1, 2, 3]])
>>> a = array([1,2,3])
>>> a
array([1, 2, 3])
>>> b = mat(a)
>>> b
matrix([[1, 2, 3]])
mat 把数组转化为矩阵

a2=a1.sum(axis=0);//列和,这里得到的是1*2的矩阵
a3=a1.sum(axis=1);//行和,这里得到的是3*1的矩阵
此外还有  all,any等










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值