基础:
-
Numpy是基于齐次多维数组(homogeneous multidimensional array)的, 是相同类型元素(elements)的一个表(table)。在Numpy中, 维度被称为轴(axes), 每一个axes中的元素个数称为维的长度(length)
- [1, 2, 1] 这个数组是一维的,其中的元素1, 2, 3是在结构上等价的。 一共有三个元素,所以length=3
- [[1, 2, 2], [2, 2, 1]]这个数组是二维的,从外往里看,首先[1, 2, 2]和[2, 2, 1]两个部分是等价的,每一个部分都是由三个元素组成且为一维。于是整个数组可以看成是[x1, x2], x1=[1, 2, 2], x2=[2, 2, 1], 于是在第一个维度有两个元素,length=2。在x1和x2中分别有三个元素,所以第二个维度的length=3。
-
Numpy中的数组被称为ndarray,也被简单地称为array。
-
Numpy最重要的函数:
1. ndarray.ndim:
返回维度的总数
2. ndarray.shape:
以元组的形式返回数组每一维的大小(length),元组的长度为数组的维度。
3. ndarray.size:
返回元素的总个数
4. ndarray.dtype:
返回元素的类型,numpy.int32, numpy.int16, numpy.float64等类型
5. ndarray.itemsize:
返回每一个元素的字节数,比如int32类型返回(32/8)= 4个字节
6. ndarray.data:
功能不明,似乎是指为数组分配一个空间,类似于C++里面的new?
例子:

创造ndarray类型变量:
1. 用python的列表或是元组创造:
numpy.array()
- 列表:

- 元组:

- 在用numpy.array()创建ndarray类型时可以指定元素类型:

2. 创造初始数组:
实际上就是创造一个给定维数和每一维元素个数的数组,但不传入数据,而是用一些特定的数代替比如说0, 1等。相当于在内存中分配一个位置。
1. numpy.zeros():
全部用0来填充,默认类型为numpy.float32

例子中创建了一个三维的数组,第一维有3个元素,第二维有4个元素,第三维有2个元素
2. numpy.ones()
全部用1来填充,默认类型维numpy.float32

例子中创建了一个三维数组,第一维有2个元素,第二维有5个元素,第三维有7个元素
3. numpy.empty()
创建一个数组,数组中的数取决于数组在内存中的位置处的值

创建出来的数组一般是非常奇怪的数,但也有可能创建出来非常整齐的数(如:本人在测试的时候创建了一个全是0.的(2, 3, 4)数组),不要多想,纯属巧合,重新打开IDLE一般就会不一样了。
4. numpy.arange([start, ]stop, [step, ]dtype=None)
创建一个数列, 可以传递四个参数:
start:开始值(默认为0);
stop:终止值;
step:步长(默认为1)
dtype:元素类型(默认为传入的数值的类型)

注意start和step要么同时有,要么同时无,也就是传递的参数要么是1个(只有stop),要么是3个(有start, stop, step),要么是4个(start, stop, step, dtype),不可能传递两个参数,如果一个有一个无,无法正确输出。
5. numpy.linespace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
创建一个以start为起点,stop为终点,中间有num项的等差数列:
1. start:开始值
2. stop:终止值
3. num:元素的个数(默认为50, 也就是生成50个元素,要是非负数)
4. endpoint: 如果为真,则终止值是最后一个元素,否则不包含终止值(默认为包含)
5. retstep: 如果为真,则以元组形式返回数组和步长,否则只返回数组(默认不返回步长)
6. dtype: 数据类型

这个函数的endpoint参数很有意思。从上面的例子可以看出,如果为False的话,则不包含stop,步长的话就是(stop-start)/num,因为start占用了一个位置,因此最后一个数一定是start+(stop-start)/num(num-1)<stop恒成立,也就一定不包含stop。但是为True的话,那么就是start+step(num-1) = stop,得到step=(stop-start)/(num-1)。
6. numpy.zeros_like(a, dtype=None, order='K', subok=True)
返回一个和a相同结构和数据类型,但全部用零填充的数组:
- a:想要复制结构的数组
- dtype:元素类型(默认为a的元素类型)
- order:改变数组的内存布局(Memory Layout),默认为‘K',意味着尽可能接近a的布局
- subok: 如果为True,则使用a的子类类型,否则创建一个新的基类

7. numpy.ones_like(a, dtype=None, order='K', subok=True)
返回一个和a相同结构和数据类型, 但全部用1来填充的数组,与numpy.zeros_like()相似

8. numpy.empty_like(a, dtype=None, order='K', subok=True)
返回一个和a相同结构和数据类型, 但全部用随机数来填充的数组,与numpy.zeros_like()相似

9. numpy.random.rand(d0, d1, d2, d3...dn)
创建一个数组,数组的结构为(d0, d1, d2, d3....),每一个元素的值在[0, 1)区间内:
d0, d1, d2, d3...:必须为整数,表示当前维度的元素个数,如果没有传入参数则返回一个浮点数


10. numpy.random.randn(d0, d1, d2, d3, d4)
创建一个数组,数组的结构为(d0, d1, d2, d3....),每一个元素的值在[0, 1)区间内, 且满足标准正态分布N(0, 1):
d0, d1, d2, d3...:必须为整数,表示当前维度的元素个数,如果没有传入参数则返回一个浮点数

如果要返回N(μ, σ^2), 使用公式σ*np.random.randn() + μ
输出
- 一般来说,如果元素个数过多,numpy只会输出头几个和末尾几个元素

- 可以用np.set_printoptions(threshold=np.nan)函数来强制输出所有元素

基本运算
1. 加减法, a+b, a-b:
相同shape的两个数组可以相加减,对应元素相加减:

2. 元素积(elementwise product) a*b:
对应元素相乘,两个数组交换位置结果不变:

3. 矩阵积(matrix product) a@b, a.dot(b)
满足矩阵乘法, 两个数组交换位置结果可能变化:

4. +=, *=:
运算规则与单个数的相似,但注意:
- 运算的两个数组要有相同的结构
- 某些类型不会自动转化:

一般只能从低精度的类型向高精度的类型转化
5. .min(), .sum(), .max():
运算规则与一元数据一样, 但可以将运算施加于特定的维度


网友评论