简单numpy

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/80377355

矩阵

    当做多维列表,层级嵌套,便于理解。

    也可以当做:属性+样本。二维的容易理解,更高维度的属性当做多维属性即可。

    向量理解:各组向量合成统一值。低维度向量合成高维度向量,然后组合。

    矩阵理解:抽取简单逻辑,复杂数据由矩阵代替,关心关系而非细节计算。

创建

    指定

data = numpy.array([[1,2,3],[4,5,6],[7,8,9]])

    随机

data = np.random.random([3, 4])
    长条
data = np.arange(0, 100, 10)
    折叠
data = np.arange(0, 100, 10)
# 属性折叠自身值变化
data.shape = 2, 5
# 方法折叠生成新矩阵,自身不变
new = data.reshape((2, 5))
# 指定一边-1,表示自动计算
b = data.reshape((5, -1))

    拉平

# 多维
data = np.array([[1, 2, 3], [4, 5, 6]])
# 长条一维
a = data.ravel()

    分割

data = np.linspace(0, 100, 10)

    定值

# 零阵
zeros = np.zeros([2, 2])
'''
[[ 0.  0.]
 [ 0.  0.]]
'''
# 一阵
ones = np.ones([2, 2])
'''
[[ 1.  1.]
 [ 1.  1.]]
'''
# 自定阵
nums = np.tile([3], (2, 2))
'''
[[3 3]
 [3 3]]
'''

    读取

# @1 文件名 
# @2 分割符
# @3 数据类型
data = np.genfromtxt('data.txt', delimiter=',', dtype=str)

属性

    类型

# 数据类型,同一矩阵类型单一统一
data.dtype

    维度

# 维度
data.ndim
    形状
# 形状
data.shape

查询

    索引

数字索引

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 取第一个
index_0 = data[0]  # [[1, 2, 3]]

布尔索引

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
bool_index = [False, True, False]
result = data[bool_index] # [[4 5 6]]

    切片

单切片

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 前置索引,单切最小维度
# 索引包小不包大
index_1_split_1_2 = data[1, 1:2] # [5]

层切片

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引是切片特殊单值形态
# 切片是范围索引指定
index_1_split_1_2 = data[0:2, :-1]
'''
[[1 2]
 [4 5]]
'''

拼接

水平拼接

A = np.arange(1, 4)
B = np.arange(4, 7)
# 水平对接,行数相同
h_stack = np.hstack((A, B))
# [1 2 3 4 5 6]

垂直拼接

A = np.arange(1, 4)
B = np.arange(4, 7)
# 垂直对接, 列数相同
v_stack = np.vstack((A, B))
'''
[[1 2 3]
 [4 5 6]]
'''

原子扩展

# 以基本数据为原子, 生成矩阵
# 数据为最低维, 原数组不组合
A = np.arange(1, 4)
base_to_all = np.tile(A, (3, 4))
print(base_to_all)
'''
[[1 2 3 1 2 3 1 2 3 1 2 3]
 [1 2 3 1 2 3 1 2 3 1 2 3]
 [1 2 3 1 2 3 1 2 3 1 2 3]]
'''

切分

    水平切分

b = np.arange(9)
# [0 1 2 3 4 5 6 7 8]
# 判断列宽,平均切割,不均报错
a = np.hsplit(b, 3)
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

    垂直切分

b = np.arange(9).reshape((3, 3))
'''
[[0 1 2]
 [3 4 5]
 [6 7 8]]
'''
# 判断列高,平均切割,不均报错
print(b)
a = np.vsplit(b, 3)
# [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

复制

    假赋值

A = np.arange(3)
# 直接相等
B = A
# 两个指向同一个实体
print(id(A) == id(B))   # True
# 操作相互等价影响
B[0] = 999
# 引用复制,假复制
print(A is B)           # True

    浅复制

A = np.arange(3)
# view复制
B = A.view()
# 不同实体
print(id(A) == id(B))   # False
# 数据相关
B[0] = 999
# 实体不同,数据相关,浅复制
print(A[0] == B[0])     # True

    深复制

A = np.arange(3)
# view复制
B = A.copy()
# 不同实体
print(id(A) == id(B))   # False
# 数据无关
B[0] = 999
# 实体不同,数据无关,真·复制
print(A[0] == B[0])     # False

排序

自排

# 自排,自身顺序变化
A = np.array([[1, 2, 3], [3, 1, 1], [2, 1, 1]])
# 竖排,行(hang)为集体,上下调整,首位为大
A.sort(axis=1)
'''
[[1 2 3]
 [1 1 3]
 [1 1 2]]
'''
# 横排,列为集体,行序不变,单列上下
A.sort(axis=0)
'''
[[1 1 1]
 [2 1 1]
 [3 2 3]]
'''

外排

# 外排,自身不变,返回排序结果
A = np.array([[1, 2, 3], [3, 1, 1], [2, 1, 1]])
# 竖排,行(hang)为集体,上下调整,首位为大
B = np.sort(A, axis=1)
'''
[[1 2 3]
 [1 1 3]
 [1 1 2]]
'''
# 横排,列为集体,行序不变,单列上下
B = np.sort(A, axis=0)
'''
[[1 1 1]
 [2 1 1]
 [3 2 3]]
'''

索引

# 索引排序
A = np.array([[1, 2, 3], [3, 1, 1], [2, 1, 1]])
# 自索引排序
C = A.argsort(axis=0)
'''
[[0 1 1]
 [2 2 2]
 [1 0 0]]
'''
# 外部索引排序
B = np.argsort(A, axis=1)
'''
[[0 1 2]
 [1 2 0]
 [1 2 0]]
'''
# 索引位置依据排列方向查找

计算

比较

A = np.arange(9).reshape((3, 3))
# 进入内部,最小维度比较
B = A > 4
'''
[[False False False]
 [False False  True]
 [ True  True  True]]
'''

筛选:比较+bool索引

A = np.arange(9).reshape((3, 3))
# 进入内部,最小维度比较
B = A > 4
# bool索引取值
C = A[B]
# [5 6 7 8]

筛选:极值

A = np.arange(9).reshape((3, 3))
# 列,自筛,最大
C = A.max(axis=0)
# [6 7 8]

# 行,外筛,最小 
B = np.min(A, axis=1)
# [0 3 6]

# 加
A = np.arange(9).reshape((3, 3))
B = np.ones((3, 3))
# 单值,顺序不论
C = A + 3
'''
[[ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
'''
# 矩阵,顺序不论
D = B + C
'''
[[  4.   5.   6.]
 [  7.   8.   9.]
 [ 10.  11.  12.]]
'''

    同加,顺序不逆

# 乘
A = np.arange(9).reshape((3, 3))
B = np.tile([2], (3, 3))
# 单值乘,顺序不论
C = A * 3
'''
[[ 0  3  6]
 [ 9 12 15]
 [18 21 24]]
'''
# 矩阵点乘,对应相乘,顺序不论
D = B * C
'''
[[ 0  6 12]
 [18 24 30]
 [36 42 48]]
'''
# 矩阵叉乘,横竖交叉,顺序不逆
E = np.multiply(B, C)
'''
[[ 0  6 12]
 [18 24 30]
 [36 42 48]]
'''

# 除
A = np.arange(9).reshape((3, 3))
B = np.tile([2], (3, 3))
# 单值除,顺序不逆
C = A / 3
'''
[[ 0.          0.33333333  0.66666667]
 [ 1.          1.33333333  1.66666667]
 [ 2.          2.33333333  2.66666667]]
'''
print(C)
# 矩阵对应相除,顺序不逆
D = C / B
'''
[[ 0.          0.16666667  0.33333333]
 [ 0.5         0.66666667  0.83333333]
 [ 1.          1.16666667  1.33333333]]
'''
print(D)
# 矩阵除法,好吧,暴露自己是假矩阵了
# 转化
E = np.asmatrix(B)
# 新生
F = np.mat(B)
G = np.multiply(B, E.I)
# 结果为1,不过没化简,奇异值矩阵会报错


猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/80377355