SuooL's Blog

蛰伏于盛夏 藏华于当春

Numpy API函数用法

此部分主要是学习过程中的一些函数笔记.

Where函数

官方文档的解释

然而看的没怎么明白。

numpy.where() 有两种用法:

  1. np.where(condition, x, y)
    满足条件(condition),输出x,不满足输出y
  2. np.where(condition)
    只有条件 (condition),没有xy,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

看到知乎回答的图示非常清晰,如下

第一种用法的图示:

输出位置的对应如下:

同理:

第二种用法的图示:
只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。即是第一组为第一维度的坐标,依次对应,每列对应一个元素完整的坐标,如下:

即有:

numpy.random.multinomial函数

官方文档地址

官方介绍

这是 numpy 提供的随机二项式分布实现,二项式分布(binomial distribution)如下表示:

函数原型如下:

1
numpy.random.RandomState.binomial(n, p, size=None)

表示对一个二项分布进行采样,size表示采样的次数,参数中的n, p分别对应于公式中的$n,p$,函数的返回值表示n成功(success)的次数(也即$N$)。
举个例子,比如掷骰子,一共3个硬币,每个都投一次,三个都是正面朝上的概率是多少?

这个使用简单的概率统计知识很容易计算得到:

使用上述函数计算大概值则是做足够多次的试验,统计其中全为正面朝上的概率,通过频率计算概率,如下:
实验结果

numpy中矩阵乘法,星乘(*)和点乘(.dot)的区别

1
2
3
4
5
import numpy
a = numpy.array([[1,2],
[3,4]])
b = numpy.array([[5,6],
[7,8]])

计算结果

1
2
3
a*b
>>>array([[ 5, 12],
[21, 32]])
1
2
3
a.dot(b)
>>>array([[19, 22],
[43, 50]])
1
2
3
4
5
6
7
numpy.dot(a,b)
>>>array([[19, 22],
[43, 50]])

numpy.dot(b,a)
>>>array([[23, 34],
[31, 46]])

星乘表示矩阵内各对应位置相乘,保证矩阵size 相同。
点乘表示求矩阵内积,遵循矩阵乘法的规则。

meshgrid() 方法

这个方法从坐标向量返回坐标矩阵。在很多地方都有应用,例如生成等高线图的数据集。

借用一张图显示:

可以看到,meshgrid()方法接受两个一维向量,生成一个坐标矩阵。

比如在画himmelblau可视化的时候可以用这个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def himmelblau(x):
return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2


x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
X, Y = np.meshgrid(x, y)
Z = himmelblau([X, Y])

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, cmap='rainbow')
ax.set_xlabel('x[0]')
ax.set_ylabel('x[1]')
plt.show()

结果如下:
函数三维图

泡面一杯