数组的拼接
注意参数是元组,而不是两个ndarray
# 竖直拼接
print(np.vstack((t1, t2)))
print("*" * 100)
# 水平拼接
print(np.hstack((t1, t2)))
数组的行列交换
行交换
t[[0, 1], :] = t[[1, 0], :]
列交换
t[:, [0, 2]] = t[:, [2, 0]]
获取最大值最小值的位置
np.argmax(t,axis=0) # 每一列的最值
np.argmin(t,axis=1) # 每一行的最值
创建一个全0的数组:
np.zeros((3,4))
创建一个全1的数组:
np.ones((3,4))
创建一个对角线为1的正方形数组(方阵):
np.eye(3)
numpy生成随机数
np.random.randint(1, 100, (3, 4))
# 输出
array([[56, 77, 9, 1],
[13, 52, 59, 26],
[50, 17, 99, 3]])
# 左闭右开
copy 和 view的区别
-
a=b 完全不复制,a和b相互影响
-
a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
-
a = b.copy(),复制,a和b互不影响
nan和inf
nan(NAN,Nan):
not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):
infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
注意点
两个nan是不相等的
可以根据这个判断有几个 nan np.count_nonzero(x != x)
,只有是nan的位置为True。
判断是否为nan:np.isnan(x)
nan和任何值计算都为 nan:例如:np.sum(x, axis = 0)
结果为 array([147., 131., nan, 266., 198.])
nan和inf都是float类型的
numpy中的统计函数
- 求和:t.sum(axis=None)
- 均值:t.mean(a,axis=None) 受离群点的影响较大
- 中值:np.median(t,axis=None)
- 最大值:t.max(axis=None)
- 最小值:t.min(axis=None)
- 极值:np.ptp(t,axis=None) 即最大值和最小值只差
- 标准差:t.std(axis=None)
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
将ndarray中含有的 nan 替换为平均值或中位数
import numpy as np
t = np.arange(12).reshape((3, 4)).astype("float")
t[1, 2:] = np.nan
print(t)
# 将 nan 替换为该列的平均值
for i in range(t.shape[1]): # 遍历每一列
temp = t[:, i] # 当前列
num = np.count_nonzero(temp != temp) # 当前列中 nan的数量
if num != 0: # 当前列中有nan
temp2 = temp[temp == temp] # 除去nan的列
mean = temp2.mean() # 平均值
temp[np.isnan(temp)] = mean # 将当前为nan的位置替换为当前列的均值
print(t)
输出
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]