NumPy基础
NumPy
- 矩阵基础的计算包
- 自带数据类型ndarray,将数据封装成带有更多信息和方法的对象,底层数据是一维序列,实际操作即为下标变换
- 已经有被tenserflow等向下延伸被吞掉的趋势
import numpy as np
a = np.array([1,2,3])
print(type(a),a.shape,a[0],a[1],a[2])
a[0] = 5
print(a)
print(a.shape)
<class 'numpy.ndarray'> (3,) 1 2 3
[5 2 3]
(3,)
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print("a.shape = ",a.shape)
print("a.dtype = ",a.dtype)
print('a.ndim = ',a.ndim)
print('itemsize = ',a.itemsize)
print(a.data[0,1])
a.shape = (2, 3)
a.dtype = int32
a.ndim = 2
itemsize = 4
2
#初始化一个数组:
b = np.array([[1,2,3],[4,5,6]])
print(b)
[[1 2 3]
[4 5 6]]
np.ones((2,3,4),dtype = np.int16)
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=int16)
np.empty((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
np.full((2,2),7)
array([[7, 7],
[7, 7]])
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.random.random((2,2))
array([[0.96509102, 0.99025245],
[0.05124781, 0.05323537]])
c = np.arange(24).reshape(2,3,4)
print(c)
d = c.reshape(12,2)
print(d)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]
[18 19]
[20 21]
[22 23]]
运算
x = np.array([[1,2],[3,4]],dtype = np.float64)
y = np.array([[5,6],[7,8]],dtype = np.float64)
#逐元素相加
print(x+y)
y = x+y
print(y.reshape(1,-1))#数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
print(np.add(x,y))
[[ 6. 8.]
[10. 12.]]
[[ 6. 8. 10. 12.]]
[[ 7. 10.]
[13. 16.]]
#逐元素相减
print(y-x)
y = np.subtract(y,x)
print(y)
[[ 1. -2.]
[-5. -8.]]
[[ 1. -2.]
[-5. -8.]]
# 逐元素相乘
print(x*y)
print(np.multiply(x,y))
[[ 2. 0.]
[ -6. -16.]]
[[ 2. 0.]
[ -6. -16.]]
# 逐元素相除
print(x/y)
print(np.divide(x,y))
[[ 1. -1. ]
[-0.6 -0.5]]
[[ 1. -1. ]
[-0.6 -0.5]]
# 逐元素开根号
print(y)
print(np.sqrt(y))
[[ 1. nan]
[nan nan]]
[[ 1. nan]
[nan nan]]
- Python中自带array,数据顺序密集存储,提供更高效的数值计算数组】
- 可以直接写成二进制文件,也可读取
-
此种array常用与C++混合编程(通向numpy的阶梯)
- ndarray:自带类型转换,内部数据类型需要一致
- 所有python中的容器类型均可初始化ndarray
-
ndarray整数不是无限长,存在溢出问题
-
Stride:加速高维数组访问,配合下标访问b[1][1][1]
- reshape 与 like
-
rewshape(1,6):1*6的矩阵,-1表面未标定的维度,自动计算,实际上是改下标
- 切片:直接下标运算是改下标不改结构,得到的是视图,更改视图对应的值将直接改变原数据
- copy 或 take 会将数据复制出来
- 切片操作如果直接标定一个维度,会得到低一阶的矩阵(会产生新的数据对象,是copy)
-
每个维度都是区段,哪怕只有一个下标
- Numpy支持组合下标访问模式
- 生成式也可组合下标(ndarray可当成下标用)
-
通过条件约束获取布尔下标矩阵,可用于过滤元素和数据清洗
- np.dot:对多种数据类型,有多种不同操作类型。矩阵乘法建立在点乘的基础上。
- 逐元素相乘:广播
-
@
- np.inner
-
numpy的array中如果元素是字符串,则长度按最长的元素对齐,且占用内存得乘4(byte),内存可能爆炸
-
向量外积:outer。高维向量的外积是低位矩阵的推广
- np.linalg:线性代数库
- 超定矩阵求解空间
-
属性计算
- 矩阵堆叠,拆分,切片
- 组合下标:产生独立副本
- 注意视图和副本
- formpyfunc:注册为自定义ufunc
-
广播机制
- Numpy数组:返回一个单维迭代器,np.nditer
- nditer用于循环结构,readwrite时,有copy和广播机制参与
- fortran:矩阵顺序相反,利用外部接口加速运算
- 迭代器返回多下标模式