2.1 numpy基本用法
(1)数组创建和属性
import numpy as np
# 数组创建
arr1 = np.array([-9, 7, 4, 3])
arr2 = np.array([-9, 7, 4, 3], dtype='float')
arr3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 等差数列
np.arange(0, 10, 0.5)
a = np.linspace(1, 10, 10)
b = np.linspace(1, 10, 10, endpoint=False)
# 等比数列
np.logspace(1, 5, base=2, num=10) # 2 ** np.linspace(1,5,10)
# 全零矩阵
np.zeros([4, 5])
# 单位矩阵
np.eye(6)
# 对角矩阵
np.diag([4, 5, 8])
# 属性
arr3.shape
arr3.ndim
arr3.size
arr3.dtype
(2)索引和切片
import numpy as np
# 普通索引
arr = np.arange(1, 10)
arr_change = arr
arr_change = arr.copy()
data = ((8.5, 6.4, 1.2), (1.5, 3, 4.7), (11, 13.4, 8))
arr2 = np.array(data)
a = arr2 > 3.5
b = arr2[arr2 > 3.5]
print(a, b)
c = arr2[~(arr2 > 3.5)]
d = (arr2 > 3.5) & (arr2 < 10)
# 花式索引(花式索引跟切片不一样,总是将数据复制到新的数组中)
arr2[[2, 1]]
# 返回数组元素(3,0)、(0,1)
arr2[[2, 2], [0, 1]]
# 如果要得到矩形区域
arr2[[0, -1]][:, [0, 1, 2]]
arr2[np.ix_([0, -1], [0, 1, 2])]
2.2 numpy高级用法
(1)数组形状改变
import numpy as np
data = ((8.5, 6.4, 1.2), (1.5, 3, 4.7), (11, 13.4, 8), (11.1, 10.4, 1))
arr = np.array(data)
arr2 = arr.reshape(6, 2) # 原数组没有发生改变
arr.reshape(-1, 2) # 原数组没有发生改变
arr.reshape(2, -1) # 原数组没有发生改变
arr.resize(6, 2) # 直接作用于数组
# 降为一维
arr.ravel()
arr.ravel(order='F') # 按照纵向
arr.flatten()
arr.flatten(order='F')
arr.flatten()[1] = 1000 # 原数组没有发生改变
arr.ravel()[1] = 100 # 原数组发生改变
arr.reshape(-1)[3] = 103 # 原数组发生改变
# 增加维度
arr_t = arr.ravel()
arr_t[np.newaxis, :]
# 合并
arr1 = np.arange(12).reshape(3, 4)
arr2 = np.array([[8.5, 6, 4.1, 2, 0.7], [1.5, 3, 5.4, 7, 3.9], [3.2, 4.5, 6, 3, 9]])
# 横向合并
np.hstack([arr1, arr2])
arr3 = np.array([[8.5, 6, 4.1, 2], [1.5, 3, 5.4, 7], [3.2, 4.5, 6, 3]])
# 纵向合并
np.vstack((arr1, arr3))
np.concatenate((arr1, arr2), axis=1)
np.concatenate((arr1, arr3), axis=0)
# 复制
arr4 = np.array([[0, 1], [2, 3]])
arr5 = np.tile(arr4, (4, 1))
print(arr4)
print(arr5)
(2)数组的ufunc广播机制
import numpy as np
arr1 = np.array([[0, 1, 3], [4, 2, 9], [4, 5, 9], [1, -3, 4]])
arr2 = np.arange(0, 12).reshape(4, 3)
a = arr1 + arr2
# 应用广播机制(列补齐和行补齐)
arr3 = np.array([1, 2, 3])
b = arr1 + arr3
arr4 = np.array([[1], [2], [3], [4]])
c = arr1 + arr4
arr5 = np.array([[1, 2, 3]])
d = arr1 + arr5
# 通用函数
# 只能给两个参数
math = np.array([98, 83, 86, 92, 67, 82])
english = np.array([68, 74, 66, 82, 75, 89])
chinese = np.array([92, 83, 76, 85, 87, 77])
# 加
total = math + english + chinese
np.add(english, np.add(chinese, math))
# 减
np.subtract(math, english)
# 除
height = np.array([165, 177, 158, 169, 173])
weight = np.array([62, 73, 59, 72, 80])
e = weight/(height/100) ** 2
f = np.divide(weight, np.divide(height, 100)**2)
# 乘
np.multiply(height, weight)
g = height * weight
# 指数
np.power(arr2, 3)
s = np.array([1, 2, 3, 4, 3, 1, 2, 2, 4, 6, 7, 2, 4, 8, 4, 5])
test = [2, 4, 6]
# 去重h
h = np.unique(s)
# 判断s中的元素是否在test里面
np.in1d(s, test)
# 交集
np.intersect1d(test, s)
# 判断
arr1 = np.array([[0, 1, 3], [4, 2, 9], [4, 5, 9], [1, -3, 4]])
arr2 = np.array([1, 2, 3])
arr1 == arr2
np.equal(arr1, arr2)
np.greater(arr1, arr2)
arr1 > arr2
np.greater(arr1, arr2).any() # 只要有一个为true就返回true
np.greater(arr1, arr2).all() # 所有为true就返回true
s1 = np.array([-1, 1, np.nan])
np.isnan(s1)
(3)排序与搜索
import numpy as np
# 排序函数
s = np.array([13, 3, 4, 3, 1, 2, 2, 4, 6, 7, 2, 4, 8, 5])
np.sort(s) # 升序
sorted(s) # 升序
np.array(sorted(s, reverse=True)) # 降序
# 搜索函数
np.argsort(s)
s.argmax()
s.argmin()
arr1 = np.array([[0, 1, 3], [4, 2, 9], [4, 5, 9], [1, -3, 4]])
arr1.argmax(axis=1)
# 条件赋值
arr2 = np.arange(12).reshape(4, 3)
a = np.where(arr2 > 3, 1, 0)
b = np.extract(arr1 > arr2, arr1)
print(a)
print(b)