基础知识
1.概念
NumPy的主要对象是同构多维数组。它是一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。在NumPy维度中称为 轴 。
eg:3D空间中的点的坐标[1, 2, 1]具有一个轴。该轴有3个元素,所以我们说它的长度为3。在下图所示的例子中,数组有2个轴。第一轴的长度为2,第二轴的长度为3。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
NumPy的数组类被调用ndarray。它也被别名所知 array。
tips:numpy.array这与标准Python库类不同array.array,后者只处理一维数组并提供较少的功能。
ndarray对象更重要的属性是:
- ndarray.ndim - 数组的轴(维度)的个数。
- ndarray.shape - 数组的维度。对于有 n 行和 m 列的矩阵,shape 将是 (n,m)。因此,shape 元组的长度就是rank或维度的个数 ndim。
- ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。
- ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
- ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize 。
- ndarray.data - 该缓冲区包含数组的实际元素。
tips:
- 1D数组和1D数组的转置形状相同
import numpy as np
a = np.array([1,2,3])
print(a.shape)
b = a.T
print(b.shape)
out:
(3,)
(3,)
- 二维行向量和列向量形状不同
a=np.arange(3).reshape(1,-1)
print(a.shape)
print(a.T.shape)
b=np.arange(3).reshape(-1,1)
print(b.shape)
out:
(1,3)
(3,1)
(3,1)
2.数组创建
numpy.array
#数字列表作为参数
a = np.array([2,3,4])
#可以将序列的序列转换成二维数组,将序列的序列的序列转换成三维数组等
b = np.array([(1.5,2,3), (4,5,6)])
#在创建时显式指定数组的类型
c = np.array( [ [1,2], [3,4] ], dtype=complex )
numpy.arange & numpy.linspace
当arange与浮点参数一起使用时,由于有限的浮点精度,通常不可能预测所获得的元素的数量。最好使用linspace函数来接收我们想要的元素数量(num),而不是步长(step)
numpy.arange(start, stop, step , dtype)
np.linspace(start, stop, num , endpoint=True, retstep=False, dtype=None)
x = np.arange(10,20,2)
#结果:
[10 12 14 16 18]
a = np.linspace(1,10,10)
#结果:、
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
numpy.asarray 从已有的数组创建数组
x = [1,2,3]
a = np.asarray(x)
print (a)
#结果:
[1 2 3]
x = [(1,2,3),(4,5)]
a = np.asarray(x)
print (a)
print(a.shape)
#结果:
[(1, 2, 3) (4, 5)]
(2,)
numpy.empty & numpy.zeros & numpy.ones
创建指定形状的随机数组
numpy.empty(shape, dtype = float, order = 'C')
创建由0组成的数组
numpy.zeros(shape, dtype = float, order = 'C')
创建由1组成的数组
numpy.ones(shape, dtype = None, order = 'C')
3.数组打印
- 最后一个轴从左到右打印,
- 倒数第二个从上到下打印,
- 其余部分也从上到下打印,每个切片用空行分隔。
然后将一维数组打印为行,将二维数据打印为矩阵,将三维数据打印为矩数组表。
强制打印完整数组不省略中心部分更改set_printoptions
import sys
np.set_printoptions(threshold=sys.maxsize)
4.基本操作
数组上的算术运算符会应用到元素级别
乘:A@B 或 A.dot(B)
+= ,*=会直接修改原矩阵数组
5.索引切片和迭代
多维的数组每个轴可以有一个索引。这些索引以逗号分隔的元组给出b[0:5, 1]
三个点( ... )表示产生完整索引元组所需的冒号x[4,...,5,:]
对多维数组进行迭代是相对于第一个轴完成的,想要对数组的每个元素执行操作,使用flat属性
for row in b:
print(row)
#结果:
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]
for element in b.flat:
print(element)
#结果:
0
1
2
3
10
11
12
13
20
···
形状操纵
1.改变数组形状
ravel() & flatten 将多维数组降为一维
ravel()返回的是视图,改变元素的值会影响原始数组;
flatten()返回的是拷贝,改变元素的值不会影响原始数组。
reshape & resize()
reshape()返回拷贝
resize()返回视图
2.堆叠数组
np.vstack()纵向堆叠
np.hstack()横向堆叠
np.column_stack()将一维数组作为列堆叠到二维数组中
3.数组拆分
np.hsplit(ary,indices_or_sections)沿数组的水平轴拆分数组,返回的形状相等的数组的数量