numpy主要用法功戚,完結(jié)
代碼
import numpy as np
import pandas as pd
import time
import matplotlib.pyplot as plt
np.random.seed(0)
# 配置pandas顯示
pd.set_option('display.max_rows', 10)
pd.set_option('display.max_columns', 10)
def compute_reciprocals(values):
output = np.empty(len(values))
time_start = time.time()
for i in range(len(values)):
output[i] = 1.0 / values[i]
time_end = time.time()
return output, time_end-time_start
# numpy 通用函數(shù)
# NumPy 為很多類型的操作提供了非常方便的、靜態(tài)類型的猖败、可編譯程序的接口旷偿,也被稱作向量操作烹俗。
# 你可以通過(guò)簡(jiǎn)單地對(duì)數(shù)組執(zhí)行操作來(lái)實(shí)現(xiàn),這里對(duì)數(shù)組的操作將會(huì)被用于數(shù)組中的每一個(gè)元素萍程。
# 這種向量方法被用于將循環(huán)推送至 NumPy 之下的編譯層幢妄,這樣會(huì)取得 更快的執(zhí)行效率。
values = np.random.randint(1, 100, size=1000000)
# print(compute_reciprocals(values))
# 數(shù)組越大茫负,越省時(shí)
time_start = time.time()
print(1.0 / values)
time_end = time.time()
print(time_end-time_start)
# 數(shù)組運(yùn)算
x = np.arange(4)
print("x = ", x)
print("x + 5 = ", x + 5)
print("np.add(x, 5): ", np.add(x, 5))
# 絕對(duì)值
print("abs(x) = ", abs(x))
print("np.abs(x) = ", np.abs(x))
# 三角函數(shù)
theta = np.linspace(0, np.pi, 3)
print("theta = ", theta)
print("sin(theta) = ", np.sin(theta))
print("cos(theta) = ", np.cos(theta))
print("tan(thata) = ", np.tan(theta))
# 反三角函數(shù)
x = [-1, 0, 1]
print("arcsin(x) = ", np.arcsin(x))
print("arccos(x) = ", np.arccos(x))
print("arctan(x) = ", np.arctan(x))
# 指數(shù)和對(duì)數(shù)
x = [1, 2, 3]
print("x = ", x)
print("e^x = ", np.exp(x))
print("2^x = ", np.exp2(x))
print("3^x = ", np.power(3, x))
x = [1, 2, 4, 10]
print("x = ", x)
print("ln(x) = ", np.log(x))
print("log2(x) = ", np.log2(x))
print("log10(x) = ", np.log10(x))
# 高級(jí)的通用函數(shù)特性
# #指定輸出
x = np.arange(5)
y = np.empty(5)
np.multiply(x, 10, out=y)
print(y)
y = np.zeros(10)
np.power(2, x, out=y[::2])
print(y)
# #聚合
x = np.arange(1, 6)
print(np.add.reduce(x))
print(np.multiply.reduce(x))
print(np.add.accumulate(x))
print(np.multiply.accumulate(x))
# #外積
x = np.arange(1, 9)
print(np.multiply.outer(x, x))
# 聚合:最小值蕉鸳,最大值和其它值
# #數(shù)組求和
# #sum 函數(shù)和 np.sum 函數(shù)并不等同,
# #尤其是它們各自的可選參數(shù)都有不同的含義,np.sum 函數(shù)是知道數(shù)組的維度
L = np.random.random(100)
print(sum(L))
print(np.sum(L))
print(L.sum())
big_array = np.random.rand(1000000)
print(min(big_array))
print(max(big_array))
print(np.min(big_array))
print(np.max(big_array))
print(big_array.min())
print(big_array.max())
# #多維度聚合
M = np.random.random((3, 4))
print(M)
print(M.sum())
print(M.min(axis=0)) # 每列最小值
print(M.min(axis=1)) # 每行最小值
# 數(shù)組的計(jì)算:廣播
# 我們?cè)谇耙还?jié)中介紹了NumPy如何通過(guò)通用函數(shù)的向量化操作來(lái)減少緩慢的Python循環(huán),
# 另外一種向量化操作的方法是利用NumPy的廣播功能潮尝。
# 廣播可以簡(jiǎn)單理解為用于不同大小數(shù)組的二進(jìn)制通用函數(shù)(加榕吼、減、乘等)的一組規(guī)則勉失。
a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
print(a + b)
print(a + 5)
M = np.ones((3, 3))
print(M + a)
a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
print(a)
print(b)
print(a + b)
X = np.random.random((10, 3))
print(X)
Xmean = X.mean(0)
print(Xmean)
X_centered = X - Xmean
print(X_centered.mean(0))
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 50)[:, np.newaxis]
z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
plt.imshow(z, origin='lower', extent=[0, 5, 0, 5], cmap='viridis')
plt.colorbar()
# plt.show()
# 比較羹蚣、掩碼和布爾邏輯
# 當(dāng)你想基于某些準(zhǔn)則 來(lái)抽取、修改乱凿、計(jì)數(shù)或?qū)σ粋€(gè)數(shù)組中的值進(jìn)行其他操作時(shí)度宦,掩碼就可以派上用場(chǎng)了
x = np.array([1, 2, 3, 4, 5])
print(x < 3)
print(np.less(x, 3))
print(x != 3)
print((2 * x) == (x ** 2))
rng = np.random.RandomState(0)
x = rng.randint(10, size=(3, 4))
print(x)
print(x < 6)
# #操作布爾數(shù)組
print(np.count_nonzero(x < 6))
print(np.sum(x < 6))
print(np.sum(x < 6, axis=1))
print(np.any(x > 8))
print(np.all(x < 10))
print(np.all(x < 8, axis=1))
# #布爾運(yùn)算符
print(np.sum((x < 8) & (x > 6)))
print(np.sum((x > 8) | (x < 6)))
# #將布爾數(shù)組作為掩碼
print(x[x < 5])
# 花哨的索引(fancy indexing)。
# 花哨的索引和前面那些簡(jiǎn)單的索引非常類似告匠,但是傳遞的是索引數(shù)組戈抄,而不是單個(gè)標(biāo)量。
# 花哨的索引讓我們能夠快速獲得并修改復(fù)雜的數(shù)組值的子數(shù)據(jù)集后专。
rand = np.random.RandomState(42)
x = rand.randint(100, size=10)
print(x)
print([x[3], x[7], x[2]])
ind = [3, 7, 2]
print(x[ind])
ind = np.array([[3, 7], [4, 5]])
print(x[ind])
X = np.arange(12).reshape((3, 4))
print(X)
row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
print(X[row, col])
# NumPy中的快速排序:np.sort和np.argsort
x = np.array([2, 1, 4, 3, 5])
print(np.sort(x))
x.sort()
print(x)
x = np.array([2, 1, 4, 3, 5])
i = np.argsort(x)
print(i)
print(x[i])
rand = np.random.RandomState(42)
X = rand.randint(0, 10, (4, 6))
print(X)
print(np.sort(X, axis=0))
print(np.sort(X, axis=1))
x = np.array([7, 2, 3, 1, 6, 5, 4])
print(np.partition(x, 3))
# 結(jié)構(gòu)化數(shù)據(jù):NumPy的結(jié)構(gòu)化數(shù)組
name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]
data = np.zeros(4, dtype={'names': ('name', 'age', 'weight'),
'formats': ('U10', 'i4', 'f8')})
print(data.dtype)
data['name'] = name
data['age'] = age
data['weight'] = weight
print(data)
print(data['name'])
print(data[0])
print(data[-1]['name'])
print(data[data['age'] < 30]['name'])
# 記錄數(shù)組
# NumPy 還提供了np.recarray類划鸽。
# 它和前面介紹的結(jié)構(gòu)化數(shù)組幾乎相同,但是它有一個(gè)獨(dú)特的特征:
# 域可以像屬性一樣獲取戚哎,而不是像字典的鍵那樣獲取裸诽。
print(data['age'])
data_rec = data.view(np.recarray)
print(data_rec.age)
輸出
[0.02222222 0.02083333 0.01538462 ... 0.01075269 0.01612903 0.05263158]
0.004407167434692383
x = [0 1 2 3]
x + 5 = [5 6 7 8]
np.add(x, 5): [5 6 7 8]
abs(x) = [0 1 2 3]
np.abs(x) = [0 1 2 3]
theta = [0. 1.57079633 3.14159265]
sin(theta) = [0.0000000e+00 1.0000000e+00 1.2246468e-16]
cos(theta) = [ 1.000000e+00 6.123234e-17 -1.000000e+00]
tan(thata) = [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
arcsin(x) = [-1.57079633 0. 1.57079633]
arccos(x) = [3.14159265 1.57079633 0. ]
arctan(x) = [-0.78539816 0. 0.78539816]
x = [1, 2, 3]
e^x = [ 2.71828183 7.3890561 20.08553692]
2^x = [2. 4. 8.]
3^x = [ 3 9 27]
x = [1, 2, 4, 10]
ln(x) = [0. 0.69314718 1.38629436 2.30258509]
log2(x) = [0. 1. 2. 3.32192809]
log10(x) = [0. 0.30103 0.60205999 1. ]
[ 0. 10. 20. 30. 40.]
[ 1. 0. 2. 0. 4. 0. 8. 0. 16. 0.]
15
120
[ 1 3 6 10 15]
[ 1 2 6 24 120]
[[ 1 2 3 4 5 6 7 8]
[ 2 4 6 8 10 12 14 16]
[ 3 6 9 12 15 18 21 24]
[ 4 8 12 16 20 24 28 32]
[ 5 10 15 20 25 30 35 40]
[ 6 12 18 24 30 36 42 48]
[ 7 14 21 28 35 42 49 56]
[ 8 16 24 32 40 48 56 64]]
50.88772629915091
50.88772629915093
50.88772629915093
7.071203171893359e-07
0.9999997207656334
7.071203171893359e-07
0.9999997207656334
7.071203171893359e-07
0.9999997207656334
[[0.6784611 0.09292122 0.03920947 0.79832448]
[0.44923861 0.95274259 0.03193135 0.18441813]
[0.71417358 0.76371195 0.11957117 0.37578601]]
5.200489656709138
[0.44923861 0.09292122 0.03193135 0.18441813]
[0.03920947 0.03193135 0.11957117]
[5 6 7]
[5 6 7]
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
[0 1 2]
[[0]
[1]
[2]]
[[0 1 2]
[1 2 3]
[2 3 4]]
[[0.11936151 0.37497044 0.22944653]
[0.07452786 0.41843762 0.99939192]
[0.66974416 0.54717434 0.82711104]
[0.23097044 0.16283152 0.27950484]
[0.58540569 0.90657413 0.18671025]
[0.07262851 0.0068539 0.07533272]
[0.77114754 0.94502816 0.79396332]
[0.81250458 0.68306202 0.09142216]
[0.72943166 0.49977781 0.88075176]
[0.77188336 0.33609389 0.35670153]]
[0.48376053 0.48808038 0.47203361]
[-2.22044605e-17 -1.11022302e-17 -6.10622664e-17]
[ True True False False False]
[ True True False False False]
[ True True False True True]
[False True False False False]
[[5 0 3 3]
[7 9 3 5]
[2 4 7 6]]
[[ True True True True]
[False False True True]
[ True True False False]]
8
8
[4 2 2]
True
True
[ True False True]
2
9
[0 3 3 3 2 4]
[51 92 14 71 60 20 82 86 74 74]
[71, 86, 14]
[71 86 14]
[[71 86]
[60 20]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ 2 5 11]
[1 2 3 4 5]
[1 2 3 4 5]
[1 0 3 2 4]
[1 2 3 4 5]
[[6 3 7 4 6 9]
[2 6 7 4 3 7]
[7 2 5 4 1 7]
[5 1 4 0 9 5]]
[[2 1 4 0 1 5]
[5 2 5 4 3 7]
[6 3 7 4 6 7]
[7 6 7 4 9 9]]
[[3 4 6 6 7 9]
[2 3 4 6 7 7]
[1 2 4 5 7 7]
[0 1 4 5 5 9]]
[2 1 3 4 6 5 7]
[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')]
[('Alice', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 37, 68. )
('Doug', 19, 61.5)]
['Alice' 'Bob' 'Cathy' 'Doug']
('Alice', 25, 55.)
Doug
['Alice' 'Doug']
[25 45 37 19]
[25 45 37 19]