版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37431083/article/details/87299466
numpy读取本地数据
numpy数组的轴
numpy读取数据和切片索引
np.loadtxt(frame,dtype=np.float,delimite=None,skiprows=0,usecols=None,unpack=False)
frame | 文件名,字符串或者产生器,可以是.gz或bz2压缩文件 |
---|---|
dtype | 数据类型,默认np.float |
delimite | 分隔字符串,默认是任何空格改为逗号 |
skiprows | 跳过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True ,读入属性将分别写入不同数组变量(数组旋转,(二维数组转置 t.transpose() )),False 读入数据只有写入一个数组变量,默认False |
- 例题
现在有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“view”,’‘likes’,“dislikes”,“comment_total”])的csv,运用上面知识,尝试来对其进行操作。
t.swapaxes(1,0) 将axis轴的1轴和0轴转换
import numpy as np
file_path = ".\GB_video_data_numbers.csv"
t1 = np.loadtxt(file_path, delimiter=",", dtype="int", unpack=True)
# 取行
print(t1[2])
# 取连续多行
print(t1[2:])
# 去不连续多行
print(t1[[2, 4, 7]])
# 取多行多列列
print(t1[1, :]) # 第一行所有列
print(t1[[2, 7, 9], :]) # 2,7,9行所有列
print(t1[2:5, [2, 6, 7]]) # 2行以后的行,2,6,7列
print(t1[10::2, 2:]) # 行取步长2
# numpy中数值的修改
t1[[2, 3], :] = 0 # 把2,3行赋值为0
print(t1)
t1[t1 < 10] = 10 # 把大于10的数赋值为10
print(t1)
# numpy的三元运算符
np.where(t1 < 20, 0, 1) # 把在数据小于20的数替换为0,否则替换为1
# numpy的裁剪
# t1.clip(10,20) # 把小于10的数替换为10,把大于20的数替换为20
# nan 是浮点类型,当要把整形数组中的某些值赋值为nan,应当要把数组转换为float
t1 = t1.astype(float)
t1[2, 3] = np.nan
数组的拼接
- 水平拼接: np.hstack((t1,t2))
- 竖直拼接: np.vstack((t1,t2))
数组的行列交换
例题
import numpy as np
# 注意这里不加"r"可能会报错,SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 124-125: truncated \UXXXXXXXX escape
GB_video = r".\GB_video_data_numbers.csv"
US_video = r".\US_video_data_numbers.csv"
GB = np.loadtxt(GB_video, dtype="int", delimiter=",")
US = np.loadtxt(US_video, dtype="int", delimiter=",")
# 用0和1分别标记国家信息
# 以下两个方法生成的数组默认是float
x = np.zeros((len(GB), 1)).astype(int)
y = np.ones((len(US), 1)).astype(int)
x1 = np.hstack((GB, x))
y1 = np.hstack((US, y))
print(np.vstack((x1, y1)))
[[7426393 78240 13548 705 0]
[ 494203 2651 1309 0 0]
[ 142819 13119 151 1141 0]
…
[ 142463 4231 148 279 1]
[2162240 41032 1384 4737 1]
[ 515000 34727 195 4722 1]]
numpy 更多好用的方法
- 获取最大值最小值的位置
- np.argmax(arr.axis=0)
- np.argmin(arr,axis=1)
- 创建一个全0的数组:np.zeros((3,4))
- 创建一个全1的数组:np.ones((3,4))
- 创建一个对角线为1的正方形数组:np.eye(3)
- 取最接近的比自己大的整数 :np.ceil(arr)
- 取最接近的比自己小的整数 :np.floor(arr)
- 四舍五入:np.rint(arr)
- 取每个元素的绝对值:np.abs(arr)
- 求最小值的索引下标:np.argmin(arr) /np.argmax(arr)如果是多维数组,将多维合并为一维数组,再找到第一个最大值的索引下标 如果是一维数组,则找到第一个最大值的索引下标
- 数组里有任意一个元素满足条件(大于0.5),返回True: np.any(arr > 0.5)
- 数组里所有元素满足条件(大于0.5),返回True:np.all(arr > 0.5)
numpy生成随机数
numpy的注意点copy和view
- a = b 完全不复制,a和b的值相互影响
- a = b[:] ,视图操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的。
- a = b.copy() ,复制,a和b互不影响。
numpy的nan和inf
- nan = not a number 表示不是一个可以用来计算的数值,如无穷大加无穷大,0除以0
- 两个nan不相等 np.nan!=np.nan
- 统计数组中nan的个数 np.count_nonzero(t2!=t2) 或者 np.isnan(t2)
- nan和任何值计算都是nan,nan无法比较大小
- 如果在一组数据中单纯的把nan替换为0,会影响整个数组的均值,所以我们一般把nan替换为均值或中值,或者是直接删除有缺失(nan)的一行
- inf表示无穷大,-inf表示负无穷
numpy中常用统计函数
- 求和:t.sum(axis=0) 如果是二维数组则把每一列加起来,,返回一个array数组
- 求均值:t.mean(axis=0) 每一列加起来求平均值,返回一个array数组
- 求中值:np.median(t,axis=0) np.median(t)
- 求最大值:t.max(axis=1) t.max()
- 求最小值:t.min(axis=1)
- 求极值:np.ptp(t.axis=0) 即最大值和最小值之差
- 标准差:t.std(axis=0) 如果标准差小,数据比较聚集,越稳定。一个较大的标准差代表大部分数值和其平均值相差大
- 方差:np.var(arr)
(默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果)
numpy中填充nan和youtube数据的练习
填充nan
import numpy as np
def fill_nan(t1):
for i in range(t1.shape[1]): # 遍历每一列
temp_col = t1[:, i]
nan_num = np.count_nonzero(temp_col != temp_col) # 当nan不等于nan,当前列nan的个数
if nan_num != 0: # 当存在nan时
temp_not_nan_col = temp_col[temp_col == temp_col] # 把当前列不是nan的数组成一个数组
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() # 找到nan,用均值替换
return t1
if __name__ == '__main__':
t1 = np.arange(24).reshape((4, 6)).astype("float")
t1[1, 2:] = np.nan
print(t1)
print(fill_nan(t1))
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. nan nan nan nan]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 12. 13. 14. 15.]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
练习
英国youtube1000的数据结合之前matplotlib绘制出评论数量的直方图
import numpy as np
from matplotlib import pyplot as plt
file_name = r".\GB_video_data_numbers.csv"
t1 = np.loadtxt(file_name, dtype=int, delimiter=",")
t1 = t1[:, 3]
t1 = t1.flatten()
t1[t1 > 10000] = 11000
x = (t1.max() - t1.min()) // 1000
plt.figure(figsize=(16, 8), dpi=80)
plt.hist(t1, x)
plt.show()
print(t1)
英国youtube视频的评论数和喜欢数的关系
import numpy as np
from matplotlib import pyplot as plt
file_name = r"C:\Users\zouyo\Desktop\GB_video_data_numbers.csv"
# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_uk = np.loadtxt(file_name, delimiter=",", dtype="int")
# 选择喜欢书比50万小的数据
t_uk = t_uk[t_uk[:, 1] <= 500000]
t_uk_comment = t_uk[:, -1]
t_uk_like = t_uk[:, 1]
plt.figure(figsize=(20, 8), dpi=80)
plt.scatter(t_uk_like, t_uk_comment)
plt.show()