そもそもなぜ numpy を学ぶのでしょうか? 証拠のない空の話、小さな演習を見てください
その中にn個の値を持つリストがあれば、ある数より大きいリストの値を取り出す
import numpy as np
import random
# 假如取出其中大于60的值
a = [random.randint(1, 100) for i in range(50)]
# print(a)
# 学python第一天
new_list = []
for i in a:
if i > 60:
new_list.append(i)
print(new_list)
# 学了匿名函数后
c = list(filter(lambda x: x > 60, a))
print(c)
# 学了numpy后
d = np.array(a)
print(d[d > 60])
[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68 69 77 69 61 77 95 96 73 88 98 74 88 98 92 63]
明らかに、numpy を使用する方がはるかに簡単です! つまり、numpy は多くのバッチ操作をより簡単かつ効率的にします! ! !
1. 設置環境
numpy は Python のサードパーティ ライブラリです。インストールするには、Windows の dos ウィンドウまたは pycharm の下のターミナルに次のコマンドを入力する必要があります。
pip install numpy
次に、配列を作成します
1. numpy パッケージをインポートする
import numpy as np
import random
2.配列を作成する
a = [random.randint(10, 30) for i in range(10)]
b = np.array(a) # 创建数组
print(b)
print(type(a), type(b)
[25 22 28 10 21 12 22 29 20 11]
<class 'list'> <class 'numpy.ndarray'>
a = np.array([1, 2, 3, 4, 5])
print(a)
b = np.array(range(10))
print(b)
[1 2 3 4 5]
[0 1 2 3 4 5 6 7 8 9]
3. 多次元配列を作成する
①二次元配列を作る
a = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
print(a)
[[1 2 3 4]
[6 7 8 9]]
a = np.arange(5, 20).reshape((3, 5))
print(a)
[[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
②三次元配列を作る
a = np.array([[[1, 2, 3, 4], [6, 7, 8, 9]], [[2, 4, 5, 6], [3, 4, 5, 6]]])
print(a)
[[[1 2 3 4]
[6 7 8 9]]
[[2 4 5 6]
[3 4 5 6]]]
a = np.arange(5, 17).reshape((2, 3, 2))
print(a)
[[[ 5 6]
[ 7 8]
[ 9 10]]
[[11 12]
[13 14]
[15 16]]]
4. すべて 0 の配列を作成する
print(np.array([0] * 10))
a = np.zeros(10) # 默认是float
b = np.zeros(10, dtype=int) # 转换为int
print(a)
print(b)
[0 0 0 0 0 0 0 0 0 0]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0 0 0 0 0 0 0 0 0 0]
5. すべて 1 の配列を作成する
print(np.ones(10)) # 默认是小数
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
6.空の配列を作成する
print(np.empty(10)) # 创建空数组,以前内存中留下的值,没有意义
[6.23042070e-307 4.67296746e-307 1.69121096e-306 3.11523921e-307
7.56599128e-307 1.37961913e-306 8.01097889e-307 1.78019082e-306
1.78020984e-306 1.60218627e-306]
7.恒等行列を作成する
print(np.eye(5))
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
8、その他
①配列の長さを求める
b = np.array(range(20))
print(b.size)
20
②
print(np.linspace(1, 13, 10)) # 将1~13平均分为10份
[ 1. 2.33333333 3.66666667 5. 6.33333333 7.66666667
9. 10.33333333 11.66666667 13. ]
③
print(np.arange(10)) # 和range用法基本类似,唯一的区别是arange第三个参数可以用小数
print(np.arange(1, 10, 0.5))
[0 1 2 3 4 5 6 7 8 9]
[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
三、配列の一括操作
1,
b = [random.randint(0, 100) for n in range(10)]
c = np.array(b)
print(c)
print(c + 1)
print(c / 3)
[72 50 91 95 35 63 66 65 53 15]
[73 51 92 96 36 64 67 66 54 16]
[24. 16.66666667 30.33333333 31.66666667 11.66666667 21.
22. 21.66666667 17.66666667 5. ]
2,
a = np.arange(10)
b = np.arange(5, 15)
print(a, b)
print(a + b)
print(b / a)
print(a > b)
print(a > 5)
print(a**0.5)
[0 1 2 3 4 5 6 7 8 9] [ 5 6 7 8 9 10 11 12 13 14]
[ 5 7 9 11 13 15 17 19 21 23]
G:/untitled/data_habding/numpy_study/day1/study2.py:76: RuntimeWarning: divide by zero encountered in true_divide
print(b / a) # [ inf 6. 3.5 2.66666667 2.25 2.
[ inf 6. 3.5 2.66666667 2.25 2.
1.83333333 1.71428571 1.625 1.55555556] # inf(infinity即无穷) 比任何浮点数都大
[False False False False False False False False False False]
[False False False False False False True True True True]
[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
4番目、配列のインデックス
1,
a = np.arange(5, 16)
print(a) # [ 5 6 7 8 9 10 11 12 13 14 15]
print(a[0]) # 5
2,
a = np.arange(15).reshape((3, 5)) # 快速创建3行5列的二维数组
print(a)
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]]
print(a[0][0]) # 0 列表式写法
print(a[0, 0]) # 0 推荐(新式写法)
print(a[1, 2]) # 7
3.ブールインデックス
a = np.arange(5)
print(a)
b = a[[True, False, True, False, False]]
print(b) # [0 2]
4.ファンシーインデックス
a = np.arange(5, 20).reshape((3, 5))
print(a)
# [[ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
print(a[0, a[0] > 6]) # [7 8 9]
print(a[[0, 2], :][:, [1, 3]])
# [[ 6 8]
# [16 18]]
5、配列のスライス
1,
a = np.arange(5, 15) # [ 5 6 7 8 9 10 11 12 13 14]
print(a[: 3]) # [5 6 7]
print(a[-5:]) # [10 11 12 13 14]
2,
a = np.arange(5, 20).reshape((3, 5))
# [[ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
print(a[:, 1]) # [ 6 11 16]
print(a[: 2, 1: 3])
# [[ 6 7]
# [11 12]]
print(a[1:, 3:])
# [[13 14]
# [18 19]]
3. 配列とリストの小さな違い
a = list(range(5, 15))
print(a)
b = np.arange(5, 15)
print(b)
c = a[: 5]
d = b[: 5]
c[0] = 20 # [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
d[0] = 20 # [20 6 7 8 9 10 11 12 13 14]
print(a)
print(b)
要約: 配列内のそのスライスの要素を変更すると、配列も変更されますが、リストは変更されません
6、numpy の一般的な関数
1、abs は絶対値を取ります
a = np.arange(-20, 5)
print(np.abs(a))
[20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 2 3
4]
2、平方根の平方根
a = np.arange(-20, 5)
print(np.sqrt(a))
[ nan nan nan nan nan nan
nan nan nan nan nan nan
nan nan nan nan nan nan
nan nan 0. 1. 1.41421356 1.73205081
2. ]
注: nan (つまり、数値ではない) は数値ではなく、どの浮動小数点数とも等しくありません (nan != nan)
3,丸
①元のpythonでは
import math
print(round(3.4)) # 四舍五入取整 3
print(int(1.9)) # 直接扔掉小数位 1
print(math.floor(1.8)) # 向下取整 1
print(math.floor(-1.8)) # 向下取整 -2
print(math.ceil(1.1)) # 向上取整 2
print(math.ceil(-1.6)) # 向上取整 -1
②でこぼこ
a = np.arange(-5.5, 5)
print(a)
print(np.round(a)) # [-6. -4. -4. -2. -2. -0. 0. 2. 2. 4. 4.]
print(np.trunc(a)) # [-5. -4. -3. -2. -1. -0. 0. 1. 2. 3. 4.]
print(np.floor(a)) # [-6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4.]
print(np.ceil(a)) # [-5. -4. -3. -2. -1. -0. 1. 2. 3. 4. 5.]
③
a = np.linspace(1, 5, 10)
print(a)
print(np.round(a, 2)) # 取两位小数
[1. 1.44444444 1.88888889 2.33333333 2.77777778 3.22222222
3.66666667 4.11111111 4.55555556 5. ]
[1. 1.44 1.89 2.33 2.78 3.22 3.67 4.11 4.56 5. ]
4. modf は 10 進数と整数のビットを取り除きます
a = np.arange(-5.5, 5.5)
print(a)
print(np.modf(a))
# (array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]),
# array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.]))
5. 2 つの特殊な浮動小数点数
①ナン
# nan(nan即not a number)不是一个数 不等于任何浮点数(nan != nan)
print(float('nan')) # nan
a = np.arange(0, 5)
print(a / a) # [nan 1. 1. 1. 1.]
print(np.nan) # 创建nan
print(np.nan == np.nan) # False
データにナンがあるかどうかを判断する方法
a = np.array([0, 3, 6, 8, 0])
b = a / a
print(np.isnan(b)) # 判断数据里面有没有nan [ True False False False True]
print(b[~np.isnan(b)]) # [1. 1. 1.] 去掉里面的nan
②インフ
# inf(infinity即无穷) 比任何浮点数都大
print(float('inf')) # inf
データに inf があるかどうかを判断する方法
a = np.array([3, 4, 6, 9]) # [inf 1. inf 4.5] 表示无穷大
b = np.array([0, 4, 0, 2])
c = a / b
print(np.inf == np.inf) # True
print(c[~np.isinf(c)]) # [1. 4.5] 去掉里面的inf
print(c[c!=np.inf]) # [1. 4.5] 去掉里面的inf
6. maximum は、2 つの配列の 1 対 1 で対応する位置の最大値を返します。
a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.maximum(a, b)) # [5 8 6 8]
7、最小値は、2 つの配列の 1 対 1 で対応する位置の最小値を返します。
a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.minimum(a, b)) # [3 5 2 1]
7. 数学的および統計的方法
1、sum() 合計
a = np.array([3, 5, 6, 8])
print(a.sum()) # 22
2, mean() 平均値
a = np.array([3, 5, 6, 8])
print(a.mean()) # 5.5
3、var() 分散 (データ セット全体の分散度) を見つける
a = np.array([3, 5, 6, 8])
print(a.var()) # 3.25
4、標準偏差(分散の平方根)を求める std()
a = np.array([3, 5, 6, 8])
print(a.std()) # 1.8027756377319946
5、max()min()で最大値、最小値を求める
a = np.array([3, 5, 6, 8])
print(a.max()) # 8
print(a.min()) # 3
6. argmax() argmin() 最大数の添え字を見つけます。最小数は次のとおりです。
a = np.arange(-10, 10)
print(a.argmax()) # 19
print(a.argmin()) # 0
ランダムに生成された 8 つの数字
1.ランダムライブラリでの使用
print(random.random()) # 返回[0, 1)的随机浮点数
print(random.randint(1, 10)) # 返回[1.10]的随机整数
print(random.choice(list(range(3, 10)))) # 从所给列表中随机选一个元素返回
a = list(range(5, 15))
random.shuffle(a) # 打乱列表
print(a)
print(random.uniform(1, 10)) # [1,10]随机返回一个浮点数
2.numpyでの使い方
print(np.random.randint(0, 10)) # 8
print(np.random.randint(0, 10, 10)) # [0 1 5 8 4 7 3 6 8 6]
print(np.random.randint(0, 10, (3, 5)))
# [[2 9 2 3 6]
# [9 2 8 4 1]
# [5 3 1 6 5]]
print(np.random.random(10)) # [0.33031099 0.35918637 0.65868327 0.74442108 0.71771834 0.74782961
# 0.15125635 0.17983218 0.37393755 0.77529924]
print(np.random.random()) # 0.7375970998290451
print(np.random.rand()) # 0.4410851788926652
print(np.random.rand(10)) # [0.14405128 0.0463478 0.97758344 0.03100739 0.94210667 0.70551171
# 0.91935786 0.43250767 0.78710345 0.78756913]
print(np.random.randint(1, 19)) # 16
print(np.random.randint(1, 19, 10)) # [ 7 15 17 12 18 14 13 15 5 16]
print(np.random.choice(np.arange(1, 10))) # 随机选一个
a = np.arange(3, 13)
np.random.shuffle(a) # 随机打乱顺序
print(a)
print(np.random.uniform(1, 10)) # 随机返回一个浮点数
print(np.random.uniform(1, 10, 10)) # 随机返回十个浮点数