Numpy


1 基本矩阵操作

1.1 纵向连接矩阵,np.r_([a,b])

纵向连接两个矩阵,就是把两矩阵上下相连,要求列数相等,类似于pandas中的concat()。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.r_[a,b])
## answer ##
[[1 4]
 [2 5]
 [3 6]]

1.2 横向连接矩阵,np.c_([a, b])

横向连接两个矩阵,就是把两矩阵左右相连,要求行数相等,类似于pandas中的merge()。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.c_[a,b])
## answer ##
[1 2 3 4 5 6]

2 随机数

2.0 设置随机数种子

  • 有时候我们想每次生成的随机数矩阵都一样,这时只需在前面加一句np.random.seed(0)即可,数字可随意指定

2.1 生成随机浮点数,np.random.random()

np.random.random()
Out[19]: 0.7954041994194649

2.2 生成随机数组,np.random.rand(100,1)

np.random.rand(100,1) # 数组大小为 100*1

2.3 生成一个随机数

np.random.uniform()  # 默认为0到1

3 线性代数 linalg

3.1 计算矩阵的逆,np.linalg.inv(matrix)

np.linalg.inv(matrix)

4 数组操作

4.1 计算数组的内积与矩阵积,np.dot(a, b)

  • 如果处理的是一维数组,则得到的是两数组的內积

  • 如果是二维数组(矩阵)之间的运算,则得到的是矩阵积(matrix product),即列数与行数相同两矩阵相乘

  • dot()函数可以通过numpy库调用,也可以由数组实例对象进行调用。a.dot(b) 与 np.dot(a,b)效果相同

a = np.array([1,1])
b = np.array([2,2])
np.dot(a,b)
# Out[28]: 4
b = np.array([[2,2], [2,2]])
a = np.ones((2,2))
np.dot(a,b)
## answer ##
Out[32]: 
array([[4., 4.],
       [4., 4.]])  

4.2 重组数组,np.reshape(a, newshepe)

  • 在不更改数据的情况下为数组赋予新的形状
  • 可以通过numpy库调用,也可以由数组实例对象进行调用。a.reshape((4,4)) 与 np.reshape(a,(4,4))效果相同
  • 其他用法
# 不知道z的shape属性是多少,让z变成一列
z = z.reshape(-1,1)

# 只给定行数,列数等于-1,让z变成指定行数
z = z.reshape(rows,-1)
  • PS:产生新的数组,需要赋值给原来数组才能完成修改

4.3 创建数组,np.array()

  • 例子
>>> np.array([1, 2, 3])
array([1, 2, 3])
  • 向上转型:
>>> np.array([1, 2, 3.0])
array([ 1.,  2.,  3.])
  • 一个以上的维度:
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
       [3, 4]])
  • 最小尺寸2:
>>> np.array([1, 2, 3], ndmin=2) // 原本是一维数组
array([[1, 2, 3]])
  • 提供的类型:
>>> np.array([1, 2, 3], dtype=complex)
array([ 1.+0.j,  2.+0.j,  3.+0.j])
  • 数据类型包含多个元素:
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
# 'a', 'b'分别代表元组两个元素的名称
>>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])
>>> x['a']
array([1, 3])
  • 从子类创建数组:
>>> np.array(np.mat('1 2; 3 4'))
array([[1, 2],
       [3, 4]])
# subok: bool,可选,如果为True,则将传递子类,否则返回的数组将被强制为基类数组(默认)。
>>> np.array(np.mat('1 2; 3 4'), subok=True)
matrix([[1, 2],
        [3, 4]])

4.4 按数值范围创建数组,numpy.arange(start, stop, step, dtype)

4.5 比较数组的相同个数,numpy.sum(arr1 == arr2)

4.6 从数组中随机抽样,np.randon.choice() 与 np.random.sample()

numpy.random.choice()抽样方法的时间几乎不会随着抽样数量的变化而变化,而random.sample() 会随着抽样数量的增加而增加。

所以当数量较少的时候,random.sample() 用时非常少,而numpy.random.choice()则很长;

当抽样数量很大的时候,numpy.random.choice()几乎不变,而random.sample() 用时变长。

4.7 去除多维数组的轴,np.squeeze(a, axis=None)

  • 注意只能去除长度为1的轴

  • 示例

>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
>>> np.squeeze(x, axis=0).shape
(3, 1)
>>> np.squeeze(x, axis=1).shape
Traceback (most recent call last):
...
ValueError: cannot select an axis to squeeze out which has size not equal to one

4.7 返回非0数组元组的索引,numpy.argwhere(condition)

  • condition表示索引数组的条件

4.8 获取非0元素值,np.nonzero()

4.9 数组维数,ndarray.ndim

  • 例子
>>> x = np.array([1, 2, 3])
>>> x.ndim
1
>>> y = np.zeros((2, 3, 4))
>>> y.ndim
3

4.10 按元素点乘 arr_a * arr_b

a = np.array([1, 1])
b = np.array([2, 2])
a * b
# Out[38]: array([2, 2])

4.11 获取数组大小

4.11.1 获取所有元素个数,size()

4.11.2 获取数组维度,shape()

4.11.3 获取第一个维度大小,len()

4.12 省略符…与冒号符:的对比

  1. ...可以代表任意多维的元素,而每个:只能代表一个维度。
  2. :可以指定代表的维度的区间范围,...不能。
  3. ...只能出现一次,而:可以出现多次,但不能超过矩阵的维度。

4.13 对一整个维度执行函数,np.apply_along_axis(func, axis, arr)

5 数学运算

5.1 求倒数 1/x,np.reciprocal()

5. 2 爱因斯坦标记法


文章作者: fdChen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fdChen !
评论
  目录
加载中...