>

LoeiJe

:D 获取中...

何以解忧?唯有暴富

numpy学习笔记

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 2019-10-23
# numpy 学习笔记
# icenaive
# 参考: https://github.com/lijin-THU/notes-python
# 仅供个人学习使用
#
# 3. numpy数组及其索引

import numpy as np

# 从列表产生数组
lst = [1, 2, 3, 4]
a = np.array(lst)
print(a)
# 由直接传入列表
a = np.array([5, 6, 7, 8])
print(a)

# 数组属性
# 查看类型
print(type(a))

# 查看数组中数据类型
print(a.dtype)

# 查看每个元素所占的字节
print(a.itemsize)

# 查看形状,返回一个元组,每个元素代表这一维的元素数目
print(a.shape)

# 查看元素数目
print(a.size)

# 查看所有元素所占的空间
print(a.nbytes)

# 但事实上,数组所占的存储空间要比这个数字大,
# 因为要用一个header来保存shape,dtype这样的信息。

# 查看维数
print(a.ndim)

# 使用fill方法设定初始值,
# 可以使用fill方法将数组设为指定值
a.fill(-4.5)
print(a.dtype)
print(a)

# 转换数据类型
a.fill(5)
print(a)
b = np.array([-1.1, 2.2])
print(b)
b = b.astype(int) # 需要将结果返回给数组
print(b)
a = a.astype(np.float32)
a.fill(-1.1)
print(a)

# 索引和切片
a = np.array([1, 2, 3, 4, 5, 6])
print(a[0], a[-1])

# 切片
print(a[1:3])
print(a[-3:-1])
print(a[1:-2])
print(a[-4:3])

# 省略参数
print(a)
print(a[::2])
print(a[-2:])

od = np.array([21000, 21180, 21240, 22100, 22400])
print(od)
dist = od[1:] - od[:-1]
print(dist)

# ## 本质上 Python 会将array的各种计算转化为类似这样的c代码
# int compute_sum (int *arr, int N){
# int sum = 0;
# int i;
# for(i = 0;i < N;i++)
# sum += arr[i];
# return sum;
# }

# 多维数组及其属性
a = np.array([[0, 1, 2, 3],
[10, 11, 12, 13]])
print(a)
print(a.shape)
print(a.size)
print(a.ndim)

# 多维数组索引
# 对于二维情况 可以传入两个数字进行索引
print(a[1, 3])
# 其中,1是行索引,3是列索引,中间用逗号隔开,
# 事实上,Python会将它们看成一个元组(1,3),然后按照顺序进行对应。
# 可以利用索引对其进行赋值
a[1, 3] = -1
print(a[1, 3])

# 可以使用单个索引来表示一行的内容
# python 会将单个索引当作对第一维的索引,返回对应的内容
print(a[1])
print(a[-1])
print(a[0])

# 多维数组切片
a = np.array([[0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
print(a)
print(a[0, 3:])
print(a[-2:, -2:])
print(a[:, 2])

# 每一维都支持切片的规则,包括负索引,
# [lower:upper:step]
# 取出3,5行奇数列
print(a[2::2, ::2])

## 切片在内存中使用的是引用机制
## 引用机制意味着 Python并没有为b分配新的空间来存储它的值,
## 而是让b指向了a分配的内存空间,因此,改变b会改变a的值
### 这种现象在列表中不会出现
a = np.array([0,1,2,3,4])
print(a)
b = a[2:4]
print(b)
b[0] = 10
print(a, b)

## 这么做的好处是,对于很大的数组,不用大量复制多余的值
## 节约了空间,
## 缺点在于,可能出现改变一个值会改变另一个值的情况。
## 一个解决的方法是使用copy()产生一个复制,这个复制会
## 申请新的内存
a = np.array([1, 2, 3, 4, 5])
b = a[2:4].copy()
b[0] = 10
print(a, b)

# 列表
a = [1,2,3,4,5]
b = a[2:4]
b[0] = 12345
print(a, b)

# 花式索引
## 切片只能够实现连续或者间隔的切片操作,
## 要想实现任意位置的操作,需要使用花式索引fancy slicing

# 一维数组
# 与range函数类似,可以使用arang产生等差数组
a = np.arange(0, 80, 5)
print(a)

# 花式索引需要指定索引的位置
index = [1, 2, -3]
print(a[index])
# 也可以通过bool数组来进行花式索引
# 布尔表达式生成数组
# mask 必须是布尔数组
mask = a > 60
print(a[mask])

from numpy.random import rand
a = rand(10)
print(a)
mask = a > 0.5
print(a[mask])

# 二维花式索引
a = np.array([[0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])

print(a)

# 二维数组花式索引需要指定 row 和 col 的值
# 返回的是一条对角线的五个值
print(a[(0, 1, 2, 3, 4), (1, 2, 3, 4, 5)])

# 返回最后三行的第1, 3, 6列 索引是 0, 2, 5
print(a[3:, [0, 2, 5]])

# 也可以使用mask(布尔数组) 进行索引
mask = np.array([1, 0, 0, 0, 0, 1], dtype=bool)
print(a[mask, 2])

## 与切片不同,花式索引返回的是原对象的一个复制而不是引用

# “ 不完全索引”
# 只给定行索引的时候返回整行:
y = a[:3]
print(y)

# 也可以用花式索引取出第2, 3, 5行
condition = np.array([0, 1, 1, 0, 1, 1], dtype=bool)
print(a)
print(a[condition])

# 三维数组索引
a = np.arange(64)
print(a)
a.shape = 4, 4, 4
print(a)

y = a[:,:,[2, -1]]
print(y)

# where 函数会返回所用非零元素的索引
# 一维情况
a = np.array([0, 12, 5, 20])
# 判断数组中元素是不是大于10
# a > 10
print(a[a>10])
# 数组中所有大于10的元素的索引位置
print(np.where(a>10))

# where 的返回值是一个元组
# 使用元组是由于where可以对多维数组使用,此时的返回值就是多维的

# 这样我们就可以这样使用
indices = np.where(a > 10)
indices = indices[0]
print(indices)

# 或者 常见

indices = np.where(a > 10)[0]
print(indices)


# 可以直接使用where的返回值进行索引
loc = np.where(a > 10)
print(a[loc])

# 多维数组
# 二维数组
a = np.array([[0, 12, 5, 20],
[1, 2, 11, 15]])
loc = np.where(a > 10)
print(loc)
# 返回结果是一个二维的元组 为结果的行索引和列索引

print(a[loc])

# 也可以这样进行操作
rows, cols = np.where(a > 10)
print(rows)
print(cols)
print(a[rows, cols])

# ######### #
a = np.arange(25)
# a = a.reshape(5, 5)
# print(a)
a.shape = 5, 5
print(a)

print(np.where(a > 12))