numpy笔记(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37431083/article/details/87299466

numpy资源汇总参考

numpy读取本地数据

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 更多好用的方法

  1. 获取最大值最小值的位置
    1. np.argmax(arr.axis=0)
    2. np.argmin(arr,axis=1)
  2. 创建一个全0的数组:np.zeros((3,4))
  3. 创建一个全1的数组:np.ones((3,4))
  4. 创建一个对角线为1的正方形数组:np.eye(3)
  5. 取最接近的比自己大的整数 :np.ceil(arr)
  6. 取最接近的比自己小的整数 :np.floor(arr)
  7. 四舍五入:np.rint(arr)
  8. 取每个元素的绝对值:np.abs(arr)
  9. 求最小值的索引下标:np.argmin(arr) /np.argmax(arr)如果是多维数组,将多维合并为一维数组,再找到第一个最大值的索引下标 如果是一维数组,则找到第一个最大值的索引下标
  10. 数组里有任意一个元素满足条件(大于0.5),返回True: np.any(arr > 0.5)
  11. 数组里所有元素满足条件(大于0.5),返回True:np.all(arr > 0.5)

numpy生成随机数

numpy生成随机数

numpy的注意点copy和view

  1. a = b 完全不复制,a和b的值相互影响
  2. a = b[:] ,视图操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的。
  3. a = b.copy() ,复制,a和b互不影响。

numpy的nan和inf

  1. nan = not a number 表示不是一个可以用来计算的数值,如无穷大加无穷大,0除以0
  2. 两个nan不相等 np.nan!=np.nan
  3. 统计数组中nan的个数 np.count_nonzero(t2!=t2) 或者 np.isnan(t2)
  4. nan和任何值计算都是nan,nan无法比较大小
  5. 如果在一组数据中单纯的把nan替换为0,会影响整个数组的均值,所以我们一般把nan替换为均值或中值,或者是直接删除有缺失(nan)的一行
  6. 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()

简易图

猜你喜欢

转载自blog.csdn.net/qq_37431083/article/details/87299466
今日推荐