@[TOC](文章目录)
1. numpy简介
numpy是一个开源的Python科学计算库, 用于快速处理任意维度的数组
import numpy as np
data = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
print(type(data))
print(data)
1.1 特点
存储风格
- ndarray: 相同类型 - 通用行不强
- list: 不同类型 - 通用行很强
并行化运算
- ndarray支持向量化运算
底层语言
- numpy底层使用C语言进行编写, 内部解除了GIL(全局解释器锁), 其对数组的操作速度不受Python解释器的限制, 效率远高于纯Python代码
import numpy as np
import random
import time
a = []
for i in range(100000000):
a.append(random.random())
start1 = time.time()
print(sum(a))
end1 = time.time()
print(end1 - start1, "秒") # 0.4297046661376953 秒
b = np.array(a)
start2 = time.time()
print(np.sum(b))
end2 = time.time()
print(end2 - start2, "秒") # 0.12291550636291504 秒
1.2 ndarray的属性
- shape: 数组维度的元组
- ndim: 数组维数
- size: 数组中元素的数量
- dtype: 数组元素的类型
- itemsize: 一个数组元素的长度(字节)
import numpy as np
data = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
print(data.shape) # (8, 5)
print(data.ndim) # 2维数组
print(data.size) # 40
print(data.dtype) # int32
print(data.itemsize) # 每个元素占用4字节
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([1, 2, 3, 4])
c = np.array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
print(a.shape) # (2, 3)
print(b.shape) # (4,)
print(c.shape) # (2, 2, 3) 这个三维数组可以看成是两个二维数组
import numpy as np
float_array = np.array([1.1, 2.2, 3.3])
print(float_array.dtype) # float64
# 指定默认的类型 (下面两个都可以)
# q = np.array([1.1, 2.2, 3.3], dtype="float32")
q = np.array([1.1, 2.2, 3.3], dtype=np.float32)
print(q.dtype) # float32
2. 基本操作
2.1 生成数组的方法
- 生成0和1
- np.zeros(shape)
- np.ones(shape)
- 从现有数组中生成
- np.array() 或者 np.copy()
- np.asarray()
当原数组更改时,新数组也会随之变化
- 生成固定范围的数组
- np.linspace(0, 10, 100)
范围: [0, 10],等距离100个元素
- np.arange(0, 10, 5)
范围: [0, 10),步长为5,即只有两个元素0和5
- 生成随机数组 (查看分布状况: 直方图)
- 均匀分布 (每组的可能性相等)
- 正态分布
import numpy as np
# 指定形状的时候, ()或[]都可以
a = np.zeros([2, 3])
print(a)
b = np.ones((2, 3))
print(b)
import numpy as np
# 从现有数组中生成
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
data1 = np.array(score)
data2 = np.copy(score)
data3 = np.asarray(score)
# 下面两种写法是一样的
# 注意: np.asarray()相当于指针指向原数组, 当原数组发生改变时, 新数组也会改变
# score[3, 1] = 10000
score[3][1] = 10000
print(data1)
print(data2)
print(data3) # 只有data3的数据发生了更改❗
下面是均匀分布和正态分布的示例
import numpy as np
import matplotlib.pyplot as plt
# 均匀分布
data1 = np.random.uniform(low=-1, high=1, size=10000000)
plt.figure(figsize=(20, 10), dpi=200)
plt.hist(data1, bins=1000)
plt.show()
# 正态分布 (平均值, 标准差, 生成的数量)
data2 = np.random.normal(loc=1.75, scale=0.1, size=10000000)
plt.figure(figsize=(20, 10), dpi=200)
plt.hist(data2, bins=1000)
plt.show()
2.2 修改数组的形状
- ndarray.reshape(shape) 返回新的ndarray, 原始数据没有变
- ndarray.resize(shape) 没有返回值, 对原始的ndarray进行了修改
- ndarray.T
转置: 行变列, 列变行
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = a.reshape((1, 6)) # 则b为(1, 6), a数组不变
print(a)
print(b)
a.resize((3, 2)) # a数组发生了改变, 为(3, 2)
print(a)
c = a.T # a不变, c变
print(c)
print(a)
2.3 类型的修改
ndarray.astype("int32")
更改数组的类型- ndarray.tobytes() 将数组序列化到本地 (把对象转化为可传输的字节序列过程称为序列化)
import numpy as np
temp = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
f = temp.flatten() # 将二维数组展平成一维数组
print(f) # [1 2 3 4 3 4 5 6]
# 数组的去重
b = np.unique(temp)
print(b) # [1 2 3 4 5 6]
3. 运算规则
3.1 逻辑运算
- 布尔索引:
arr[arr > 1] 选出数组中大于1的元素
- 通用判断函数:
- np.all() 只要有一个False就返回False, 只有全是True才返回True
- np.any() 只要有一个True就返回True, 只有全是False才返回False
- 三元运算符
- np.where(arr > 0, 1, 0)
大于0置为1, 否则置为0
import numpy as np
arr = np.array([1, -1, 2, -2, 0.5])
# np.logical_and()表示逻辑相与
arr[np.logical_and(arr > 0, arr < 1)] = 100
print(arr) # [ 1. -1. 2. -2. 100.]
3.2 统计运算
- 统计指标函数
(np.函数名 或者 ndarray.方法名 都是可以的)
- max / min 最大值和最小值
- mean 平均值
- median 中位数
- var 方差
- std 标准差
按列取最大值
print(arr.max(axis=0))
按行取最大值print(np.max(temp, axis=1))
- 返回最大值、最小值所在位置
- np.argmax(arr, axis=0)
列
- np.argmin(arr, axis=1)
行
3.3 数组间的运算
- 数组与数的运算:
arr + 1
表示数组的每一个元素都加1- 数组与数组运算:
- 广播机制: numpy两个数组的相加、相减以及相乘都是对应元素之间的操作, 与矩阵相乘是不一样的。 当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作, 这种机制叫做广播(
broadcasting
)- 只有两个数组满足广播机制, 才可以进行相加相加、相减、相乘等操作
- 当操作两个数组时, numpy会逐个比较它们的shape, 只有在下述情况下, 两个数组才能够进行数组与数组的运算:
- 维度相等
- shape其中相对应的一个地方为1
- 运算结果的形状: 取两者的最大值
A 256×256×3
B 3
Result 256×256×3
A 9×1×7×1
B 8×1×5
Result 9×8×7×5
A 5×4
B 1
Result 5×4
A 15×3×5
B 15×1×1
Result 15×3×5
3.4 矩阵运算
矩阵matrix必须是二维的, 但是array可以是多维的 存储矩阵:
- ndarray 二维数组
- 矩阵乘法:
np.matmul() 或者 np.dot() 或者 arr1 @ arr2
- matrix 数据结构 np.mat() 将数组转换为矩阵类型
矩阵乘法:
(m, n) × (n, k) = (m, k)
3.5 合并与分割
- 水平拼接
np.hstack((arr1, arr2))
- 竖直拼接
np.vstack((arr1, arr2))
np.concatenate((arr1, arr2), axis=?)
当axis为0时, 表示竖直拼接 当axis为1时, 表示水平拼接分割操作:
import numpy as np
x = np.arange(10, 19, 1)
print(x) # [10 11 12 13 14 15 16 17 18]
# 表示将数组等分成3份 (若不能等分会报错)
a1, a2, a3 = np.split(x, 3)
print(a1) # [10 11 12]
print(a2) # [13 14 15]
print(a3) # [16 17 18]
# 而array_split可以不等分
b1, b2 = np.array_split(x, 2)
print(b1) # [10 11 12 13 14]
print(b2) # [15 16 17 18]
# 若参数是列表, 表示按索引进行分割, 对应数组的下标为左闭右开❗
c1, c2, c3, c4 = np.split(x, [2, 5, 7]) # [10 11 12 13 14 15 16 17 18]
print(c1) # [10 11]
print(c2) # [12 13 14]
print(c3) # [15 16]
print(c4) # [17 18]
3.6 IO操作与数据处理
不建议使用numpy进行数据的读取, 因为不方便处理缺省值 data = np.genfromtxt("test.csv", delimiter=",")
# 原数据
id,value1,value2,value3
1,123,1.4,23
2,110,,18
3,,2.1,19
# 输出
[[ nan nan nan nan]
[ 1. 123. 1.4 23. ]
[ 2. 110. nan 18. ]
[ 3. nan 2.1 19. ]]
标签:67,print,np,数组,使用,数据挖掘,array,numpy
From: https://blog.51cto.com/u_16057418/6346659