v = [0.5,0.75,1.0,1.5,2.0]
x = [0.5,0.75,1.0,1.5,2.0]
y = [0.5,0.75,1.0,1.5,2.0]
m =[v,v,v]
m
m[1]
m[1][2]
1.0
# 对于 Jupyter notebook
import numpy as np
import warnings
warnings.simplefilter('ignore')
%matplotlib inline
from matplotlib import pyplot as plt
import seaborn as sns
# 示例使用
data = np.random.randn(1000)
sns.histplot(data, kde=True)
plt.title('Example Histogram')
plt.show()

import numpy as np
a = np.array([0,0.5,1.0,1.5,2.0])
print(a)
print(type(a))
[0. 0.5 1. 1.5 2. ]
<class 'numpy.ndarray'>
a * 2
array([0., 1., 2., 3., 4.])
b = np.array(range(5))
print(b)
[0 1 2 3 4]
a + b
array([0. , 1.5, 3. , 4.5, 6. ])
a ** 2
array([0. , 0.25, 1. , 2.25, 4. ])
2 ** a
array([1. , 1.41421356, 2. , 2.82842712, 4. ])
a ** a
array([1. , 0.70710678, 1. , 1.83711731, 4. ])
b = np.random.standard_normal(1000000)
b
array([ 1.13601923, 0.41234919, 0.30718787, ..., -0.43725952,
0.03715676, 0.07668733], shape=(1000000,))
c = list(b)
%time c = [i*2 for i in b]
CPU times: total: 93.8 ms
Wall time: 88.7 ms
%time 2 * b
CPU times: total: 0 ns
Wall time: 2.29 ms
array([ 2.27203846, 0.82469837, 0.61437575, ..., -0.87451903,
0.07431351, 0.15337465], shape=(1000000,))
np.sqrt(a)
array([0. , 0.70710678, 1. , 1.22474487, 1.41421356])
np.sqrt(2.5)
np.float64(1.5811388300841898)
import math
math.sqrt(2.5)
1.5811388300841898
b = np.array([a,a*2])
b
array([[0. , 0.5, 1. , 1.5, 2. ],
[0. , 1. , 2. , 3. , 4. ]])
b[0]
array([0. , 0.5, 1. , 1.5, 2. ])
b[0,2]
np.float64(1.0)
b.sum() # 所有元素全部求和,不管是第一行还是第二行
np.float64(15.0)
d = b.sum(axis=0) # axis=0是按列求和
print(d)
[0. 1.5 3. 4.5 6. ]
e = b.sum(axis=1) # axis=0是按行求和
print(e)
[ 5. 10.]
#条件索引、布尔值
year_arr = np.array([[1998,2001,2000],
[2005,2002,2003],
[2006,2004,2008]])
filtered_arr = year_arr[year_arr>=2005]
print(filtered_arr)
[2005 2006 2008]
filtered_arr = year_arr[(year_arr<=2005) & (year_arr%2 ==0)] # “或 ”使用 |
print(filtered_arr)
[1998 2000 2002 2004]
arr = np.random.randn(3,4)
print(arr)
[[ 0.5762243 -0.13528037 -0.6728994 -1.1753083 ]
[-1.37623103 -0.83079539 0.59286483 0.7799382 ]
[-0.9253736 0.78190355 -0.23116942 1.40318738]]
np.where(arr>0,1,-1) # np.where(条件判断,True:值,False:值)
array([[ 1, -1, -1, -1],
[-1, -1, 1, 1],
[-1, 1, -1, 1]])
np.sign(arr) # 正的返回1,负的返回-1
array([[ 1., -1., -1., -1.],
[-1., -1., 1., 1.],
[-1., 1., -1., 1.]])
print(np.any(arr>0))
True
print(np.all(arr>0))
False
print(a)
b = a.reshape(5) # 重塑
b
[0. 0.5 1. 1.5 2. ]
array([0. , 0.5, 1. , 1.5, 2. ])
b = np.array(b,dtype=float)
b
array([0. , 0.5, 1. , 1.5, 2. ])
b*2
array([0., 1., 2., 3., 4.])
b>10
array([False, False, False, False, False])
b[b>10]
array([], dtype=float64)
b[(b>10) & (b<20)]
array([], dtype=float64)
#Numpy Ndarray的创建方法
l = range(10)
data = np.array(l)
print(data)
print(data.shape) #
print(data.ndim) #
[0 1 2 3 4 5 6 7 8 9]
(10,)
1
# 嵌套序列转换为ndarray
l2 = [range(10),range(10)]
data = np.array(l2)
print(data)
print(data.shape) #(2,10) 2行10列
[[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]]
(2, 10)
c = np.zeros((2,3,4), dtype='i') #全零的数组 # 创建一个形状为 (2, 3, 4) 的三维数组,数据类型为整数
print(c) # 数组形状 (2, 3, 4) 第一维:2 个元素(可以理解为 2 个平面/矩阵) 第二维:每个平面有 3 行 第三维:每行有 4 列
print(c.shape) # 这个数组总共有 2 × 3 × 4 = 24 个元素,全部初始化为整数 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]]]
(2, 3, 4)
one_arr = np.ones((2,3)) # 创建一个形状为 (2, 3) 的二维数组,所有元素为 1
one_arr # 数组形状 (2, 3) 第一维:2 行 第二维:3 列 总共有 2 × 3 = 6 个元素
array([[1., 1., 1.],
[1., 1., 1.]])
d = np.ones_like(c,dtype='f',order='C') # 创建一个与数组 c 形状相同但元素全为 1 的新数组
d # order='C':指定内存布局为 C 风格(行优先)
# 'C':C 风格,行优先(默认值)
# 'F':Fortran 风格,列优先
# 'A':保持与输入数组 c 相同的顺序
# 'K':尽可能保持与输入数组 c 相同的内存布局
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)
e = np.empty((2,3,4)) # 创建一个形状为 (2, 3, 4) 的三维数组,内容未初始化
e # 不初始化数组元素:数组中的值是随机的,是内存中的原始数据
# 形状:(2, 3, 4) 表示:
# 第一维:2 个元素(2 个平面)
# 第二维:每个平面有 3 行
# 第三维:每行有 4 列
# 总元素:2 × 3 × 4 = 24 个
array([[[-0.25, -0.5 , 0. , -0.25],
[ 0.25, -0.5 , 0.5 , -0.25],
[ 0.25, 0. , 0.5 , 0.25]],
[[ 0.25, 0.5 , 0. , 0.25],
[-0.25, 0.5 , -0.5 , 0.25],
[-0.25, 0. , -0.5 , -0.25]]])
g = np.linspace(5,15,15) # # 创建从 5 到 15(包含端点)的 15 个等间距点 ,5~15等距离分15份
g
array([ 5. , 5.71428571, 6.42857143, 7.14285714, 7.85714286,
8.57142857, 9.28571429, 10. , 10.71428571, 11.42857143,
12.14285714, 12.85714286, 13.57142857, 14.28571429, 15. ])
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
type(np.arange(10))
numpy.ndarray
g = np.linspace(1,15,15)
g
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,
14., 15.])
g.shape
(15,)
np.shape(g)
(15,)
g.reshape((3,5)) # 构建出想要额数据结构
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[11., 12., 13., 14., 15.]])
np.arange(10).reshape(2,5)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
print(g)
np.resize(g,(3,2))
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.]
array([[1., 2.],
[3., 4.],
[5., 6.]])
np.resize(g,(1,5))
array([[1., 2., 3., 4., 5.]])
np.resize(g,(5,4))
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 1.],
[ 2., 3., 4., 5.]])
h = np.resize(g,(5,3))
print(h)
h.T # 转置
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]
[13. 14. 15.]]
array([[ 1., 4., 7., 10., 13.],
[ 2., 5., 8., 11., 14.],
[ 3., 6., 9., 12., 15.]])
h.transpose() # 转置
array([[ 1., 4., 7., 10., 13.],
[ 2., 5., 8., 11., 14.],
[ 3., 6., 9., 12., 15.]])
print(h)
np.hstack((h,2*h))
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]
[13. 14. 15.]]
array([[ 1., 2., 3., 2., 4., 6.],
[ 4., 5., 6., 8., 10., 12.],
[ 7., 8., 9., 14., 16., 18.],
[10., 11., 12., 20., 22., 24.],
[13., 14., 15., 26., 28., 30.]])
print(h)
np.vstack((h,2*h))
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]
[13. 14. 15.]]
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.],
[10., 11., 12.],
[13., 14., 15.],
[ 2., 4., 6.],
[ 8., 10., 12.],
[14., 16., 18.],
[20., 22., 24.],
[26., 28., 30.]])
h.flatten()
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,
14., 15.])
h.flatten(order='C')
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,
14., 15.])
h.flatten(order='F')
array([ 1., 4., 7., 10., 13., 2., 5., 8., 11., 14., 3., 6., 9.,
12., 15.])
for i in h.flatten(order='C'):
print(i,end=' ')
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0
r = np.random.standard_normal((4,3)) # 生成一个符合标准正态分布的随机数组:
s = np.random.standard_normal((4,3)) # 生成一个形状为 (4, 3) 的数组,元素服从标准正态分布
# 1. 标准正态分布
# 均值 μ = 0
# 标准差 σ = 1
# 概率密度函数:$f(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{x^2}{2}}$
# 大约 68% 的数据在 [-1, 1] 之间,95% 在 [-2, 2] 之间
print(r)
print('---------------')
print(s)
[[-0.37037595 0.98599302 1.61741552]
[-0.67741868 0.38069952 0.75054242]
[ 1.05923802 -1.18756829 0.73425732]
[-1.67827063 -0.26760523 0.51534513]]
---------------
[[-0.48924505 0.37452073 0.0206262 ]
[-0.04270628 0.98546438 -1.5370172 ]
[-0.1317573 -0.83769127 0.61298976]
[-0.94184784 0.70637614 -1.4063769 ]]
import random
np.random.seed(10)
random.seed(10) # 锁定产生的随机数
s = np.random.standard_normal((4,3))
s
array([[ 1.3315865 , 0.71527897, -1.54540029],
[-0.00838385, 0.62133597, -0.72008556],
[ 0.26551159, 0.10854853, 0.00429143],
[-0.17460021, 0.43302619, 1.20303737]])
np.random.seed(10) # 锁定产生的随机数
t = np.random.standard_normal((4,3))
t
array([[ 1.3315865 , 0.71527897, -1.54540029],
[-0.00838385, 0.62133597, -0.72008556],
[ 0.26551159, 0.10854853, 0.00429143],
[-0.17460021, 0.43302619, 1.20303737]])
t + s # 元素级相加
array([[ 2.66317301, 1.43055795, -3.09080058],
[-0.0167677 , 1.24267195, -1.44017112],
[ 0.53102317, 0.21709705, 0.00858286],
[-0.34920042, 0.86605238, 2.40607475]])
t
array([[ 1.3315865 , 0.71527897, -1.54540029],
[-0.00838385, 0.62133597, -0.72008556],
[ 0.26551159, 0.10854853, 0.00429143],
[-0.17460021, 0.43302619, 1.20303737]])
2 * t + 3
array([[ 5.66317301, 4.43055795, -0.09080058],
[ 2.9832323 , 4.24267195, 1.55982888],
[ 3.53102317, 3.21709705, 3.00858286],
[ 2.65079958, 3.86605238, 5.40607475]])
def f(x):
return 3 * x + 5
f(0.5)
6.5
r
array([[-0.37037595, 0.98599302, 1.61741552],
[-0.67741868, 0.38069952, 0.75054242],
[ 1.05923802, -1.18756829, 0.73425732],
[-1.67827063, -0.26760523, 0.51534513]])
f(r)
array([[ 3.88887215, 7.95797906, 9.85224657],
[ 2.96774396, 6.14209855, 7.25162726],
[ 8.17771406, 1.43729513, 7.20277195],
[-0.03481188, 4.19718431, 6.54603539]])
import math
math.sin(r) # 普通的python math函数不能作用于numpy array
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[155], line 2
1 import math
----> 2 math.sin(r) # 普通的python math函数不能作用于numpy array
TypeError: only 0-dimensional arrays can be converted to Python scalars
np.sin(r)
array([[-0.36196591, 0.83382068, 0.99891352],
[-0.62678377, 0.37156999, 0.68203554],
[ 0.87198272, -0.92746245, 0.67003603],
[-0.99423019, -0.26442267, 0.49283518]])
#numpy和python循环的性能比较
import math
%time l = [math.sin(x) for x in range(10000000)]
CPU times: total: 891 ms
Wall time: 910 ms
%time l = np.sin(np.arange(10000000)) #尽量在python层面避免循环可以大幅提升运算速度
CPU times: total: 156 ms
Wall time: 164 ms
%time l = [np.sin(x) for x in range(10000000)] #不要将numpy的函数方法用于普通的python数据类型
CPU times: total: 7.66 s
Wall time: 7.77 s
%%time
num = 99999
x = []
y = []
for i in range(num):
x.append(i)
y.append(math.sin(x[i] ** 3) + math.cosh(x[i] / num))
CPU times: total: 234 ms
Wall time: 225 ms
%%time
num = 99999999
#x = np.linspace(l,num,num)
#y = np.sin(x**3) + np.cosh(x/num)
CPU times: total: 0 ns
Wall time: 2.62 μs