arange
| arange(start,stop=None,step=1, dtype=None) | 产生一个在区间 [start, stop) 之间,以 step 为间隔的数组,如果只输入一个参数,则默认从 0 开始,并以这个值为结束 |
linspace
| linspace(start, stop, N) | 产生 N 个等距分布在 [start, stop]间的元素组成的数组,包括 start, stop |
logspace
| logspace(start, stop, N) | 产生 N 个对数等距分布的数组,默认以10为底: |
meshgrid
| x, y = np.meshgrid(x_ticks, y_ticks) x, y = np.meshgrid(x_ticks, y_ticks, sparse=True) 在这个选项下,x, y 变成了单一的行向量和列向量。 | 有时候需要在二维平面中生成一个网格,这时候可以使用 meshgrid 来完成这样的工作 |
ogrid , mgrid
| x,y=np.ogrid[-1:1:.5, -1:1:.5] x,y=np.ogrid[-1:1:5j, -1:1:5j]
|
|
r_ , c_
|
|
我们可以使用 r_ / c_ 来产生行向量或者列向量。 |
ones , zeros
| ones(shape, dtype=float64) zeros(shape, dtype=float64)
| 产生一个制定形状的全 0 或全 1 的数组,还可以制定数组类型 |
empty
| empty(shape, dtype=float64, order='C') | 可以使用 empty 方法产生一个制定大小的数组(数组所指向的内存未被初始化,所以值随机),再用 fill 方法填充: |
empty_like, ones_like, zeros_like
| empty_like(a) ones_like(a) zeros_like(a) | 产生一个跟 a 大小一样,类型一样的对应数组。 |
identity
| indentity(n, dtype=float64) | 产生一个 n 乘 n 的单位矩阵: |
生成数组的函数
arange
类似于Python中的 range
函数,只不过返回的不是列表,而是数组:
产生一个在区间 [start, stop)
之间,以 step
为间隔的数组,如果只输入一个参数,则默认从 0
开始,并以这个值为结束:
与 range
不同, arange
允许非整数值输入,产生一个非整型的数组:
np.arange(0, 2 * np.pi, np.pi / 4)
数组的类型默认由参数 start, stop, step
来确定,也可以指定:
np.arange(0, 2 * np.pi, np.pi / 4, dtype=np.float32)
由于存在精度问题,使用浮点数可能出现问题:
np.arange(1.5, 2.1, 0.3)
stop
的值 2.1
出现在了数组中,所以使用浮点数的时候需要注意。
产生 N
个等距分布在 [start, stop]
间的元素组成的数组,包括 start, stop
。
np.linspace(0, 1, 5)
产生 N 个对数等距分布的数组,默认以10为底:
np.logspace(0, 1, 5)
产生的值为。
有时候需要在二维平面中生成一个网格,这时候可以使用 meshgrid
来完成这样的工作:
这里产生的 x, y
如下:
x
y
x
对应网格的第一维,y
对应网格的第二维。
图例:
事实上,x, y
中有很多冗余的元素,这里提供了一个 sparse
的选项:
x
y
在这个选项下,x, y
变成了单一的行向量和列向量。
但这并不影响结果:
meshgrid
可以设置轴排列的先后顺序:
- 默认为
indexing='xy'
即笛卡尔坐标,对于2维数组,返回行向量x
和列向量y
- 或者使用
indexing='ij'
即矩阵坐标,对于2维数组,返回列向量x
和行向量y
。
Matlab中有 meshgrid
的用法:
Numpy的 meshgrid
并不支持这样的用法,但我们可以使用 ogrid / mgrid
来实现类似这样的用法。
ogrid
与 mgrid
的区别在于:
ogrid
相当于meshgrid(indexing='ij', sparse=True)
mgrid
相当于meshgrid(indexing='ij', sparse=False)
x, y = np.ogrid[-1:1:.5, -1:1:.5]
x
y
注意:
- 这里使用的是中括号
- Matlab 使用的是
start:step:end
的表示,Numpy 使用的是start:end:step
的表示 - 这里的结果不包括
end
的值
为了包含 end
的值,我们可以使用这样的技巧:
x, y = np.ogrid[-1:1:5j, -1:1:5j]
x, y
我们在 step
的位置传入一个复数 5j
,表示我们需要一个 5
个值的数组,此时返回值就会包含 end
的值。
重复之前的画图:
这里,我们交换了 x, y
输出值的顺序。
我们可以使用 r_ / c_
来产生行向量或者列向量。
使用切片产生:
np.r_[0:1:.1]
复数步长制定数组长度:
np.r_[0:1:5j]
连接多个序列,产生数组:
np.r_[(3,22,11), 4.0, [15, 6]]
列向量:
np.c_[1:3:5j]
产生一个制定形状的全 0
或全 1
的数组,还可以制定数组类型:
np.zeros(3)
np.ones([2,3], dtype=np.float32)
产生一个全是 5
的数组:
np.ones([2,3]) * 5
也可以使用 empty
方法产生一个制定大小的数组(数组所指向的内存未被初始化,所以值随机),再用 fill
方法填充:
另一种替代方法使用索引,不过速度会稍微慢一些:
产生一个跟 a
大小一样,类型一样的对应数组。
np.empty_like(a)
np.zeros_like(a)
np.ones_like(a)
indentity(n, dtype=float64)
产生一个 n
乘 n
的单位矩阵:
np.identity(3)