
-
问:为什么需要Numpy?
import numpy as np
print(np.__version__)
Numpy最重要的特性——ndarray :支持N维数组对象
-
问:python列表和ndarray最大的区别是什么?
- 列表元素可以是字符串、字典、元组中的一种或多种
- Numpy数组中的元素必须数统一中数据类型
-
问:什么是Numpy就高不就低类型转换规则?
- Numpy常用命令
# np.array
data = [6, 8.5, 9, 0]
arr1 = np.array(data)
data2 = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(data2)
>>> arr2: array([[1,2,3,4],[5,6,7,8]])
# 嵌套序列转为与嵌套级别相适配的高维数组
# astype()
arr1 = arr1.astype(np.int32)
# np.arrange(start, stop, step, dtype)
arr3 = np.arange(10)
arr3 = arr3 + 1 # 这是向量加,每个元素加1
### 这就是“广播”机制
# np.linspace(start, stop, num)
c = np.linspace(1, 10, 20) # 1-10之间均匀等分取20个数,左闭右闭
- Numpy其他常用函数
# 0/1填充
np.ones((3,4))
np.zeros((2,3)) # (2,3)元组匿名函数
>> 等价于
np.zeros(shape = [3,4])
np.ones(shape = [3,4], dtype = float)
# np.zeros_like(array)
array = np.array([[1, 2, 3.0],[4, 5, 6]])
b_zeros = np.zeros_like(array)
# np.ones_like(array)
# np.empty_like()
# np.full_like()
# ndarray.reshape()
arr = np.arange(6)
arr = arr.reshape((2,3)) # (2,3)元组
>>> arr:
>>> array([[0,1,2],
[3,4,5]])
N维数组的属性
ndarray: 属性都是不带括号的!!!
# ndarray.ndim 几维数组
array = np.arange(1, 10)
array.ndim # 1
# ndarray.shape 数组的形状
array.shape # (9,)
# ndarray.size
array.size # 9
二维数组也被称为2D张量
Numpy数组的运算
向量运算、算术运算、逐元素运算
向量运算
加减乘除+平方
a * b 等价于 np.multiply(a, b)
统计函数
逐元素运算与张量点乘运算
# 数学矩阵乘法 点乘
np.dot(a, b)
>>> 等价于
a2 = np.mat(a)
b2 = np.mat(b)
a2 * b2
矩阵运算
a = np.array([0,1,2,3])
a2 = np.mat(a)
a2.I # 逆矩阵
a2.T # 转置矩阵
a2.A # 返回二维矩阵对应的二维数组
爱因斯坦求和约定
einsum()
!!!!! 待定
Numpy中的轴方向
约减 Reduce 规约
axis
操作数组元素
通过索引访问数组元素
- 索引index
one_dim[0]
two_dim[0][1]
two_dim[0][2] = 100
- 切片访问
- 二维数组的转置和展平
transpose()方法将二维数组转置
ravel()完成展平——比如将多维数组降维成一维数组
flatten()
shape(1,-1)
ravel()返回的是原始数组视图,flatten会完成从原始数据到新内存空间的深拷贝。原始数组都不会发生任何变化。
-
问:视图是什么概念?
- 视图就是说不会拷贝原来的内容,而是指向原来的内容
Numpy广播
Numpy数组的高级索引
- Fancy Indexing
- 布尔索引
数组的堆叠操作
堆叠 stack
-
水平方向堆叠 horizontal stack ----- hstack()
- 等价于 np.concatenate((arr1, arr2), axis = 1)
-
垂直方向堆叠 vertical stack ------ vstack()
- 等价于 np.concatenate((arr2, arr3))
-
深度方向堆叠 depth-wise stack ------- dstack()
concatenate()
-
按列方向堆叠column_stack()
-
row_stack()
数组的分割操作
-
hsplit()
- 分割成多个部分
-
vsplit()
-
dsplit()
-
split()可以通过设置分割方向实现上诉三个split功能
Numpy中的随机数模块
numpy.random
随机数是由随机种子根据一定的规则计算出来的数值,所以如果计算方法一定随机种子一定,那么随机数就不会变。若不设定随机种子,随机数生成器会将系统时间作为随机种子来生成随机数。
import numpy as np
•
rdm = np.random.RandomState(1) # 定义随机种子
np.random.seed(19680101) # 定义随机种子
•
rand = np.random.rand(2, 3) # 随机数服从均匀分布
print(rand)
•
randn = np.random.randn(2, 3) # 随机数服从正态分布
print(randn)
•
randint = np.random.randint(1, 10, (2,3)) # 生成2X3的1-10内的随机整数
print(randint)
•
random = np.random.random((2,3)) # 在[0,1)之间生成随机数
print(random)
>>>>>
[[0.23675601 0.59353868 0.74897519]
[0.66065819 0.8813292 0.93499822]]
[[-0.40220931 -0.43350804 -0.60667041]
[ 0.84595394 -0.25406136 -0.97673417]]
[[8 5 6]
[8 6 4]]
[[0.23670515 0.4502083 0.20860286]
[0.65182319 0.23997355 0.63095928]]