import numpy as np
# 一、 创建ndarray数组:
# 1. 一维数组创建
n1 = np.array([1, 2, 3])
print(n1)
# 2. 二维数组
n2 = np.array([[1, 2, 3], [4, 5, 6]])
print(n2)
# 3.注意:
# 3.1 numpy默认ndarray的所有元素的类型是相同的
# 3.2 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
n3 = np.array([[1, 2.1, 3], ['4', 5, 6.6]])
print(n3)
# 4.arange()方法生成一个一维数组 与 range类似
n4 = np.arange(10)
n4 = np.arange(1, 12, 2)
print(n4)
# 5.查看与指定数组元素类型
n5 = np.arange(10)
print(n5)
print(n5.dtype)
# 指定数组类型(忘记了可以查看一下类型表)
n6 = np.arange(10, dtype=float)
n6 = np.arange(10, dtype='int64')
n6 = np.arange(10, dtype='i1')
n6 = np.arange(10, dtype='float64')
print(n6)
print(n6.dtype)
# 指定为bool值
n7 = np.array([1, 0, 1, 1, 0, 0, 1], dtype=bool)
print(n7)
# 修改数据类型 astype方法
n7 = n7.astype('i1')
print(n7)
print(n7.dtype)
import numpy as np
# 数组的运算:
# 不需要循环即可对数据进行批量运算,叫做矢量化运算. 不同形状的数组之间的算数运算,叫做广播.
n1 = np.array([1, 2, 3, 4, 5])
n2 = np.array([6, 7, 8, 9, 10])
# 1.数组与数字值运算
s1 = n1 + 10
s1 = n1 - 1
s1 = n1 * 2
s1 = n1 / 2
print(s1)
# 2.数组和数组之间的运算
s2 = n1 + n2
s2 = n1 * n2
s2 = n1 - n2
print(s2)
# 只要长度相同就可以运算
# 3.多维数组的运算
s3 = np.arange(10).reshape((2, 5))
s4 = np.arange(10).reshape((2, 5))
# print(s3 + s4)
# print(s3 * s4)
s5 = np.arange(1, 3).reshape((2, 1))
print(s5 + s4)
# 只要行或者列一样对的上就可以运算
import numpy as np
n1 = np.arange(10)
# print(n1)
# 总长度
print(n1.size)
# 元素类型
print(n1.dtype)
# 形状(各维度的长度)
print(n1.shape)
# 查看维度
print(n1.ndim)
import numpy as np
# n1 = np.linspace(1, 100, num=20)
# n1 = np.random.randint(0, 100, size=(4, 5))
# n1 = np.arange(1, 21).reshape((20, ))
# print(n1)
# 1.与列表一致
# print(n1[0])
# print(n1[2][2])
# 数组花式索引:
# n2 = np.empty((8, 4))
# for i in range(8):
# n2[i] = np.arange(i, i + 4)
# print(n2)
# res1 = n2[[1,2,3]]
# print(res1)
# res2 = n2[[1, 3, 5], [1, 2, 3]]
# print(res2)
# 2.切片
n3 = np.arange(1, 33).reshape((8, 4 ))
# print(n3)
# 获取行
# print(n3[5:])
# 获取列
# print(n3[:, :1])
# 获取指定行的第一列
# print(n3[:3, :1])
# 行翻转
# print(n3[::-1])
# 列翻转
# print(n3[:, ::-1])
# 给数组重新赋值
# print(n3<10)
# n3[n3 > 10]=0
# print(n3)
# 两个方法都可以实现给数组元素重新赋值
# 条件满足改为8 否则改为2
print(np.where(n3 < 10, 8, 2))
# print(n3.clip(10, 20))
print(np.clip(n3, 10, 20))
import numpy as np
# 1.数组拼接
# t1 = np.arange(1, 11).reshape((2, 5))
# t2 = np.arange(11, 21).reshape((2, 5))
# # 竖直拼接(拼成多行)
# res1 = np.vstack((t1, t2))
# print(res1)
# # 水平拼接(拼成多列)
# res2 = np.hstack((t1, t2))
# print(res2)
# 根据axis来决定
# np.concatenate((t1,t1,t1),axis=1)
# 2.数组的行或列 交换
# t3 = np.arange(1,13).reshape((3,4))
# print(t3)
# 行交换
# t3[[1, 2], :] = t3[[2, 1], :]
# print(t3)
# 列交换
# t3[:, [1,2]] = t3[:, [2,1]]
# print(t3)
# 3.练习 两个国家的信息拼接 使用0,1来注明国家
mei_path = './test/mei.txt'
ying_path = './test/ying.txt'
# 加载本地数据
mei_arr = np.loadtxt(mei_path, delimiter=',', dtype='int64')
ying_arr = np.loadtxt(ying_path, delimiter=',', dtype='int64')
# 添加声明信息
zeros_data = np.zeros((mei_arr.shape[0], 1), ).astype(int)
ones_data = np.ones((ying_arr.shape[0], 1), ).astype(int)
# 拼接两组数据
# 每列后面添加0,1来表示 竖直拼接
mei_arr = np.hstack((mei_arr, zeros_data))
ying_arr = np.hstack((ying_arr, ones_data))
# 最终把两个拼接成一个 水平拼接
final_data = np.vstack((mei_arr, ying_arr))
print(final_data)
import numpy as np
# 1.随机生成数组方法
# 创建0~1的指定数组
# t1 = np.random.random((3, 3))
# print(t1)
# 创建指定范围的随机数组
# t2 = np.random.randint(1, 10,size=(2,5),dtype="i1")
# print(t2)
# 随机种子
# np.random.seed(10) # 固定随机性
# t3 = np.random.randint(1,10,(2,5))
# print(t3)
# 2.numpy常用统计方法
# t4 = np.arange(1, 10).reshape((3, 3))
# print(t4)
# 平均值
# n1 = np.mean(t4, axis=1) # 计算每行的均值
# n1 = np.mean(t4, axis=0) # 计算每列的均值
# print(n1)
# 所有元素的总和
# n2 = np.sum(t4)
# n2 = np.sum(t4, axis=1) # 每行总和
# n2 = np.sum(t4, axis=0) # 每列总和
# print(n2)
# 所以元素最大值最小值,可以指定轴
# n3 = np.max(t4)
# n4 = np.min(t4)
# print(n3)
# print(n4)
# 3.nan和inf
# 什么是nan和inf?
# nan: 表示不是一个数字,np.nan是一个float类型的数据
# inf:inf表示正无穷,-inf表示负无穷,当一个数字除以0时,python会报错
# 为什么会有nan和inf?
# 当我们读取本地文件为float时,如果有缺失,或者做了不合适的计算,比如无穷大(inf)减去无穷大。
# 所有涉及nan的操作,返回的都是nan
# 怎么处理nan?
# print(np.nan == np.nan) # nan是不相等的
# print(np.nan != np.nan)
# t = np.arange(1, 25).reshape((4, 6)).astype(float)
# t[1, 2:] = np.nan
# a = np.count_nonzero(t != t) # 返回为True的个数,返回多少说明就有多少个值为nan
# print(a)
# print(np.isnan(t))
# t[np.isnan(t)] = 0 # 取出为nan的值修改为0
# print(t)
# 案列判断是否有nan然后修改为均值:
def fill_ndarray(t):
for i in range(t.shape[1]):
temp_col = t[:, i] # 当前的一列
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0:
temp_not_nan = temp_col[temp_col == temp_col] # 当前列去掉nan的array
mean = np.mean(temp_not_nan) # 当前列的均值
# 获取当前列的nan然后替换成均值
temp_col[np.isnan(temp_col)] = mean
return t
if __name__ == '__main__':
t = np.arange(1, 25).reshape((4, 6)).astype(float)
t[1, 2:] = np.nan
t = fill_ndarray(t)
print(t)