numpy
#!/usr/bin/env python
# coding: utf-8
numpy其实就是一个多维的数组对象,下载方式:
pip install numpy
pip install pandas
shape 和 dtype
# In[3]:
import numpy as np
data = [1,2,3,4,5]
n = np.array(data * 10)
print(data)
print(n)
# ### 每一个np的数组都有一个shape和一个叫做dtype的方法
# In[7]:
n.shape # shape属性表示获取到np数组的维度(长度)
# In[8]:
n.dtype # dtype属性表示获取到数组的类型
嵌套序列
是由一组等长列表组成的列表
# In[13]:
arr = [[1,2,3,4], [1,2,3,4]]
arr2 = np.array(arr)
print(arr2)
np.array(arr)
print(arr2.ndim) # ndim代表了维度
print(arr2.shape) #
np对数据类型的一个判断
# In[19]:
# 不好的示范来进行讲解
arr = [[1,'2',3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype) # unicode类型
# In[20]:
arr = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype)
# In[22]:
arr = [[1,2.1,3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype) # 当成员当中有一个为float时,那么numpy将会推断成为float64类型
numpy进行指定长度数组的创建
np.zeros(10)
# In[24]:
np.ones((2,3))
# In[25]:
np.empty((2,3,4))
# In[27]:
np.arange(10) # arange是range函数的数组版本
# In[30]:
arr = np.array([1.2,1.6,1.8,-2.3,-5.8])
print(arr)
print(arr.dtype)
print(arr.astype(np.int32)) # 转化(astype)为int32(np.int32)数据类型
# ### int 8 16 32 64
# ### float类型 16(半精度) 32(标准单精度) 64(标准双精度) 128(扩展精度)
矢量化
数组通常不用在编写循环的情况下就可以进行批量运算
# In[32]:
arr1 = np.array([1,2,3,4])
arr2 = np.array([5,6,7,8])
arr1 + arr2
# In[34]:
arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 + arr2
# In[35]:
arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 * arr2
# In[38]:
arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
print(arr1 - arr2)
print(arr2 - arr1)
# In[40]:
arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 / arr2
arr2 / arr1
维度不等的
# In[42]:
arr1 = np.array([[1,2,3,4], [10,2,3,4]])
5 * arr1 # 广播
numpy数组的索引和切片操作
# In[44]:
arr = np.arange(10)
print(arr)
print(arr[1])
print(arr[4:])
arr[0:4] = 11
print(arr)
arr_copy = arr.copy()
print(arr_copy)
# In[47]:
一个二维数组的访问方式
arr1 = np.array([[1,2,3], [4,5,6]])
print(arr1[0][1])
print(arr1[0, 1])
# In[52]:
names = np.array(['Tony', 'Jack', 'Robin'])
print(names == 'Tony') # 广播出去了!!
print((names == 'Tony') & (names == 'Robin')) # and 操作!!
print((names == 'Tony') & (names == 'Tony'))
print((names == 'Tony') | (names == 'Robin')) # or 操作!!
花式索引(Fancy indexing)
它是一个NumPy中的索引,指的是利用整数数组进行索引
# In[56]:
arr = np.empty((8, 4))
print(arr)
print('++++++++++++++++++++++++++++')
for i in range(8):
arr[i] = i
print(arr)
print('++++++++++++++++++++++++++++')
print(arr[[4, 3, 0 ,6]]) # 分别访问第四行第三行第0行。。。。
# 以一个特定的顺序来选取行中的子集,我们传入一个用于指定顺序的整数列表,或数组
# 这里也可以用负数索引从末行获取
# In[66]:
arr = np.arange(32).reshape((8, 4))
print(arr)
print('++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2]])
print('++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) # 先分别选行,然后分别选列
# In[69]:
# 对比上面的操作
print(arr[[1, 5, 7, 2]])
print('++++++++++++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]) # 这里的“:”表示:选择所有行之后,再每行分别对列依次选择。
# 再选择完1,5,7,2行的数据后,我们来进行列上的一个选择
print('++++++++++++++++++++++++++++++++++++++++++++++++')
print(arr[np.ix_([1,5,7,2], [0,3,1,2])]) # 这函数np.ix_()表示的是:先依次找出各个行,
# 然后再对每行依次找列,等价于上面
数组转置和轴对换
转置就是重塑数组的一种特殊的形式,常用的方法 T 和 transpose
# In[75]:
arr = np.arange(15).reshape((3, 5))
print(arr)
print('-' * 80)
print(arr.transpose())
print('-' * 80)
print(arr.T)
# In[79]:
arr= np.arange(24).reshape((2,3,4))
print('-' * 80)
print(arr)
print('-' * 80)
print(arr.transpose((1,2,0)))
print('-' * 80)
print(arr.transpose((1,0,2)))
# In[84]:
arr2 = np.arange(10)
print(np.sqrt(arr2))
print(np.exp(arr2))
# In[95]:
x = np.random.randn(8)
y = np.random.randn(8)
print(x, y, sep = '\n--------------------------------\n')
np.maximum(x, y)
points = np.arange(-5, 5, 1) # 产生-5至5之间,间隔1的10个数
print('-' * 50)
print(points)
# xs按行重复points元素10次,ys按列重复points元素10次
xs, ys = np.meshgrid(points, points) # 采样点的生成
print('-' * 50)
print(xs)
print('-' * 50)
print(ys)
matplotlib入门
# pip install matpoltlib
import matplotlib.pyplot as plt
z = np.sqrt(xs ** 2 + ys **2)
plt.imshow(z, cmap=plt.cm.gray) # imshow 就是一个绘图函数
plt.colorbar()
plt.title('Imange plot of $\sqrt{x^2+y^2}$ for a grid of values')
plt.show()# 显示图形
条件逻辑转数组
np.where 等同于 x if condition else y 矢量化的一个版本;
x if condition else y 表示的意思是当条件condition成立时,表达式的返回值是x,不成立时返回值是y;
np.where 的写法,一般用于根据一个数组产生一个新的数组,跟python中函数式变成中的map、reduce等函数类似。
# In[104]:
x_arr = np.array([1.1, 1.2, 1.3])
y_arr = np.array([2.1, 2.2, 2.3])
condition = np.array([True, False, True])
# 原始版本
result = [(x if z else y) for x, y, z in zip(x_arr, y_arr, condition)]
print(result)
# In[105]:
# 等价于上面
r = np.where(condition, x_arr, y_arr)
print(r)
值替换
arr = np.random.randn(4, 4)
print(arr)
print('-' * 50)
arr_1 = np.where(arr > 0, 2, -2)
print(arr_1)
print('-' * 50)
arr_2 = np.where(arr < 0, -1, arr)
print(arr_2)
print('-' * 50)
numpy 的数学运算
常用函数 sum mean std
# In[113]:
arr = np.random.randn(4, 4)
print(arr)
print('-' * 50)
print(arr.mean())
print('-' * 50)
print(np.mean(arr))
print('-' * 50)
print(arr.sum())
print('-' * 50)
print(arr.std())
print('-' * 50)
# In[118]:
### 在一个轴上进行运算
arr = np.arange(20).reshape((4, 5))
print(arr)
print('-' * 50)
print(arr.mean(axis = 1)) # 计算轴1上的平均值
print('-' * 50)
print(arr.sum(0))
# argmin argmax cumsum
排序方法
# In[119]:
arr = np.random.randn(4)
print(arr)
arr.sort() # 从小到大
print('-' * 50)
print(arr)
多维数组排序
arr = np.random.randn(4, 4)
print(arr)
arr.sort(1) # 传递轴号,按轴来进行排序
print('-' * 50)
print(arr)
arr.sort()
print('-' * 50)
print(arr)
# In[134]:
arr = np.random.randn(4, 4)
print(arr)
arr.sort()
print('-' * 50)
print(arr)
arr.sort(1)
print('-' * 50)
print(arr)
arr.sort(0)
print('-' * 50)
print(arr)
print(arr.sort(1) == arr.sort())
numpy的文件操作
- numpy 可以读写磁盘上的文本数据或者是二进制数据
- 主要应用的函数就是 np.save 和 np.load,默认情况下数据是以未压缩的原始二进制格式保存在扩展名.npy的文件中
arr = np.arange(10)
print(arr)
np.save('any_array', arr)
print('-' * 50)
np.load('any_array.npy')
# In[140]:
arr = np.arange(10)
np.savez('any_array_1', a = arr)
# 保存成一个压缩文件,数组以关键字参数的形式传入
np.load('any_array_1.npz')['a']
# In[146]:
arr = np.arange(10)
np.savez('any_array_2.npz',a = arr)
# 保存成一个压缩文件,数组以关键字参数的形式传入
np.load('any_array_2.npz')['a']
# In[149]:
arr = np.arange(10)
np.savetxt('any_array.txt', arr, delimiter=',')
# 这就是保存了一个文本文件,分隔符指定为位逗号
np.loadtxt('any_array.txt', delimiter=',')
线性代数
- dot 矩阵的乘法运算
- trace 计算对角线元素的和
- det 计算矩阵的行列式
- eig 计算方阵的本征值和本征向量
- inv 计算方阵的逆
# In[153]:
x = np.array([[1,2,3], [4,5,6]])
y = np.array([[1,2], [4,5], [7,8]])
print(x.dot(y), y.dot(x), sep = '\n---------------\n')
随机漫步的例子
# In[166]:
# 求什么时候第一次,距离初始点十步远
position = 0 # 初始化一个位置的值
walk = [position] # 步值的初始化
steps = 1000 # 步数设置
for i in range(steps):
step = 1 if np.random.randint(0, 2) else -1
position += step
walk.append(position)
# 画图
plt.plot(walk)
# 求什么时候第一次距离初始点十步远
print((np.abs(walk) >= 10).argmax()) # 难怪前面的判断返回的是布尔值,所以才会返回第一个true
print((np.abs(walk) >= 10))
# numpy.argmax(array, axis) 用于返回一个numpy数组中最大值的索引值。
# 当一组中同时出现几个最大值时,返回第一个最大值的索引值。
输出:
404
[False False False … True True True]