>

LoeiJe

:D 获取中...

何以解忧?唯有暴富

numpy学习笔记

numpy学习笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 2019-10-25
# numpy 学习笔记
# icenaive
# 参考: https://github.com/lijin-THU/notes-python
# 仅供个人学习使用
#
# 7. 数组形状

import numpy as np

# 修改数组形状
a = np.arange(6)
print(a)

# 修改为2*3
a.shape = 2, 3
print(a)

# 相同功能的是reshape 但是reshape不会修改原数组,他会返回一个新的数组
b = a.reshape(3, 2)
print(b)
print(a)

# shape 和 reshape 不能修改原来数组总数,或者会报错

print("newaxis:\n")
# 使用 newaxis 增加数组维数
a = np.arange(3)
print(np.shape(a))
print(a)

b = a[np.newaxis, :]
print(b)
print(np.shape(b))

# 根据插入位置不同可以返回不同形状的数组
b = a[:, np.newaxis]
print(np.shape(b))

# 可以插入多个维度
b = a[np.newaxis, :, np.newaxis]
print(np.shape(b))

# 使用 squeeze 方法去除多余的轴
# squeeze 方法返回一个将所有长度为1的维度去除的新数组

a = np.arange(6)
a.shape = 2, 1, 3
print(a)
print(np.shape(a))
b = a.squeeze()
print(np.shape(b))
print(np.shape(a)) # 没有修改a

# 使用 transpose 返回数组的转置,本质是将数组的所有维度反过来
print(a)
print(a.transpose())
print(a) # 不会修改原数组

# 或者写缩写 T 属性 不是方法
print(a.T)
print(a) # 不会修改原数组

## 对于复数数组,转置并不返回复共轭,只是单纯的交换轴的位置
## 转置可以作用于多维数组

a = np.arange(60)
a.shape = 3, 4, 5
print(a)
print(np.shape(a))
b = a.T
print(b)
print(np.shape(b))

# 转置只是交换了轴的位置
# 另一方面,转置返回的是对原数组的另一种view,所以改变转置会改变原来数组的值。

a = np.arange(6)
a.shape = 2, 3
print(a)
b = a.T
b[0, 1] = 10 # 修改b会修改a的值 引用???
print(a)

# 数组连接
# 有时需要将不同的数组按照一定的顺序连接起来:
# concatenate((a0, a1, ..., aN), axis=0)
# 注意,这些数组要用 () 包括到一个元组中去。
# 除了给定的轴外,这些数组其他轴的长度必须是一样的。
x = np.array([
[0, 1, 2],
[10, 11, 12]
])
y = np.array([
[50, 51, 52],
[60, 61, 62]
])
print(x.shape)
print(y.shape)

# 默认沿着第一维进行连接, 竖着
z = np.concatenate((x, y)) # 数组需要用元组括号括起来
print(z, z.shape)

# 沿着第二维进行连接
z = np.concatenate((x, y), axis = 1)
print(z, z.shape)

# 还可以将他们连接成三维的数组, 但是 concatenate 不提供这样的功能 可以这样做
z = np.array((x, y))
print(z, z.shape) # 这是什么鬼形状

# numpy 中分别提供了三种情况的函数
# vstack # 第一维连接
# hstack # 第二维连接
# dstack #
print(np.vstack((x, y)).shape)
print(np.hstack((x, y)).shape)
print(np.dstack((x, y)).shape)

# flatten 是将多维数组转换为一组
# 返回的是数组a的复制,改变b不会改变a
a = np.array([[0, 1],
[2, 3]])
b = a.flatten()
print(b)

# flat 属性
# flat 相当于返回了所有元组组成的一个迭代器
print(a.flat)
b = a.flat
print(b[1])
# 修改b会同时修改a
b[1] = -1
print(a[0])
print(a.flat[:])

# ravel 方法
# ravel 提供更高效的表达方式
a = np.array([[0, 1],
[2, 3]])
b = a.ravel()
print(b)
# 改变b会同时改变a
b[0] = 10
print(a)

# 另一种情况
a = np.array([[0, 1],
[2, 3]])
aa = a.transpose()
b = aa.ravel()
print(b)

b[0] = 100
print(aa)
print(a)
# 可以看到,在这种情况下,修改 b 并不会改变 aa 的值,原因是我们用来 ravel 的对象 aa 本身是 a 的一个view。


# atleast_{x}d 函数 x可以取值1, 2, 3
# 保证数组至少有x维
x = 1
print(np.atleast_1d(x))

a = np.array([1, 2, 3])
b = np.atleast_2d(a)
print(b.shape)
print(b)
c = np.atleast_3d(b)
print(c)

Scipy库中,这些函数被用来保证输入满足一定的条件:“

用法 Scipy中出现次数
value.flaten() < br > value.flat < br > value.ravel() ~2000次
atleast_1d(value) < br > atleast_2d(value) ~700次
asarray(value) ~4000次