Python数据分析易错知识点归纳(二):Numpy

二、numpy

不带括号的基本属性

arr.dtype
arr.shape  # 返回元组
arr.size
arr.ndim # 维度

arr.reshape/arr.resize/np.resize

  • arr.reshape(不同维度size...)有返回值,不会改变原数值;arr.resize((不同维度size...))无返回值,会直接改变原数组;np.resize(arr, (不同维度size...))有返回值,不会改变原数组(注意reshape与resize参数形式的不同,前者是几个参数,后者是一个元组
  • reshape要求前后元素个数一致,否则报错;resize可放大或缩小原数组形状,方大时,用0补充,缩小时,删除多余的。
  • 维度size填写时:reshape的不同维度size可以填一个-1,其值可以根据arr.size自动计算;而resize则没有这个特性,但不会报错,当其余维度一样时,-1自动变为其它维度一样;否则-1自动变为1。
'''
numpy.resize 函数返回指定大小的新数组
如果新数组大小大于原始大小,则包含原始数组中的元素的副本
numpy.resize(arr, shape)
shape:返回数组的新形状
'''
a = np.array([[1, 2, 3], [4, 5, 6]])
print('第一个数组:')
print(a)
print('第一个数组的形状:')
print(a.shape)
b = np.resize(a, (3, 2))
print('第二个数组:')
print(b)
print('第一个数组:')
print(a)  # 第一个数组不变
print('第二个数组的形状:')
print(b.shape)
a.resize((3, 2))
print('第一个数组改变:')
print(a)  # 第一个数组改变
# 注意a的第一行在b中重复出现,因为尺寸变大
print('修改第二个数组的大小:')
b = np.resize(a, (3, 3))
print(b)

# 对比
arr = np.arange(12)
arr1 = arr.reshape(-1, 2, 2) # -1自动计算
print(len(arr1)) # 3
arr2 = np.resize(arr, (2, -1, 2)) # (2, 2, 2)
print(arr2)
'''
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
'''
arr3 = np.resize(arr, (2, -1, 3))  # (2, 1, 3)
print(arr3)
'''
[[[0 1 2]]

 [[3 4 5]]]
'''

np.amin/np.amax

a = np.array([[3, 7, 5], [8, 4, 3], [2, 4, 9]])
print('原数组:')
print(a)
print('调用amin()函数横向最小值:')
print(np.amin(a, 1))  # 与np.min一样
print('再次调用amin()函数纵向最小值:')
print(np.amin(a, 0))
print('调用amax()函数:')
print(np.amax(a))  # 与np.max一样
print('调用amax()函数纵向最大值:')
print(np.amax(a, axis=0))

np.argmax、np.argmin

np.argwhere

indexName = np.argwhere(scoreAll == name)

np.argsort

# numpy.argsort()函数返回的是数组值从小到大的索引值
x = np.array([3, 1, 2])
print('原数组:')
print(x)
print('对x调用argsort()函数:')
y = np.argsort(x)
print(y)

​```
对 x 调用 argsort() 函数:
[1 2 0] # 排序后的索引值
​```

np.sort

a = np.array([[3, 7], [9, 1]])
print('原数组:')
print(a)
print('调用sort() 函数:')
print(np.sort(a)) # 默认是axis=1
print('按列排序:')
print(np.sort(a, axis=0))

# 在sort函数中排序字段
# 若定义了dtype, 则每个元组视为一个整体,排序时,元组内部不会改变
dt = np.dtype([('name', 'S10'), ('age', int)])
a = np.array([('raju', 21), ('anil', 25), ('ravi', 17), ('amar', 27)], dtype=dt)
print(a)
'''
[(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]
'''
print(np.sort(a))  # 若order缺省,按照第一个字段排
'''
[(b'amar', 27) (b'anil', 25) (b'raju', 21) (b'ravi', 17)]
'''
print(np.sort(a, order='age'))
'''
[(b'ravi', 17) (b'raju', 21) (b'anil', 25) (b'amar', 27)]
'''

# 不同之处
# 由于没有定义dtype, numpy会将所有的元素都转换为字符串, 元组也会转为列表
a = np.array([('raju', 21), ('anil', 25), ('ravi', 17), ('amar', 27)])
print(a)
'''
[['raju' '21']
 ['anil' '25']
 ['ravi' '17']
 ['amar' '27']]
'''
print(np.sort(a))
'''
[['21' 'raju']
 ['25' 'anil']
 ['17' 'ravi']
 ['27' 'amar']]
'''

np.cumsum

arr = np.arange(6).reshape(2, 3)
print(arr)
'''
[[0 1 2]
 [3 4 5]]
'''
print(np.cumsum(arr))  # 先展开,再累计求和
'''
[ 0  1  3  6 10 15]
'''
print(np.cumsum(arr, axis=0))
'''
[[0 1 2]
 [3 5 7]]
'''
print(np.cumsum(arr, axis=1))
'''
[[ 0  1  3]
 [ 3  7 12]]
'''

np.append

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print('向数组添加元素:')
print(np.append(a, [7, 8, 9]))
print('沿轴0添加元素:')
print(np.append(a, [[7, 8, 9]], axis=0))
print('沿轴1添加元素:')
print(np.append(a, [[5, 5, 5], [6, 6, 6]], axis=1))
'''
[[1 2 3]
 [4 5 6]]
向数组添加元素:
[1 2 3 4 5 6 7 8 9]
沿轴0添加元素:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
沿轴1添加元素:
[[1 2 3 5 5 5]
 [4 5 6 6 6 6]]
'''

np.insert

a = np.array([[1, 2], [3, 4], [5, 6]])
print('第一个数组:')
print(a)
print('未传递Axis参数。在插入之前输入数组会被展开。')
print(np.insert(a, 3, [11, 12]))
print('传递Axis参数。会广播值数组来配输入数组。')
print('沿轴0广播插入第2行:')
print(np.insert(a, 1, [11, 12], axis=0))
print('沿轴1广播插入第2列:')
print(np.insert(a, 1, 11, axis=1))
'''
第一个数组:
[[1 2]
 [3 4]
 [5 6]]
未传递Axis参数。在插入之前输入数组会被展开。
[ 1  2  3 11 12  4  5  6]
传递Axis参数。会广播值数组来配输入数组。
沿轴0广播插入第2行:
[[ 1  2]
 [11 12]
 [ 3  4]
 [ 5  6]]
沿轴1广播插入第2列:
[[ 1 11 2]
 [ 3 11 4]
 [ 5 11 6]]
'''

np.delete

a = np.arange(12).reshape(3, 4)
print('第一个数组:')
print(a)
print('未传递Axis参数。在插入之前输入数组会被展开。')
print(np.delete(a, 5))
print('删除第二列:')
print(np.delete(a, 1, axis=1))
print('删除后a:')
print(a)
print('包含从数组中删除的替代值的切片:')
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(np.delete(a, np.s_[::3]))
'''
第一个数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
未传递Axis参数。在插入之前输入数组会被展开。
[ 0  1  2  3  4  6  7  8  9 10 11]
删除第二列:
[[ 0  2  3]
 [ 4  6  7]
 [ 8 10 11]]
包含从数组中删除的替代值的切片:
[2 3 5 6 8 9]
'''

np.unique

去重并排序

a = np.array([5, 2, 6, 2, 7, 5, 6, 8, 2, 9])
print('第一个数组:')
print(a)
print('第一个数组的去重值:')  # 去重并排序
u = np.unique(a)
print(u)
print('新列表元素在旧列表中的位置下标:')
u,indices = np.unique(a, return_index=True)
print(indices)
print('可以看到每个和原数组下标对应的数值:')
print(a)
print('去重数组的下标:')
u,indices = np.unique(a, return_inverse=True)
print(u)

np.extract

x = np.arange(100).reshape(10, 10)
cond = np.mod(x, 2) != 0
print(np.extract(cond, x))  # 抽取后展开
'''
[ 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47
 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95
 97 99]
'''

np.intersect1d

x = np.array([1, 1, 2, 5, 4])
y = np.array([2, 1, 4, 5])
xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)
print(xy)  # [1 2 4 5]
print(x_ind) # [0 2 4 3]
print(y_ind) # [1 0 2 3]

切片和布尔过滤

arr = np.arange(15).reshape(3, 5)
arr1 = arr[:, 1:2]  # 也可以写成arr[..., 1:2]
'''
[[ 1]
 [ 6]
 [11]]
'''
arr2 = arr[1:, 2:]
'''
[[ 7  8  9]
 [12 13 14]]
'''
arr3 = arr[[0, 0, 2, 2], [1, 3, 1, 3]]
'''
[ 1  3 11 13]
'''
arr4 = arr[(arr >= 5) & (arr <= 10)]  # 会展开
'''
[ 5  6  7  8  9 10]
'''
arr5 = arr[(arr < 5) | (arr > 10)]
'''
[ 0  1  2  3  4 11 12 13 14]
'''

# 注意Numpy布尔过滤与DataFrame的区别
x=np.arange(1,10,1).reshape([3,3])
print(x>4)
'''
[[False False False]
 [False  True  True]
 [ True  True  True]]
'''
print(x[x>4])   # 注意这里与DataFrame的区别:DataFrame是形状不变,不满足的值为NaN
'''
[5 6 7 8 9]
'''

# 利用np.where进行布尔过滤
arr = np.arange(10)
print(arr[np.where(~(arr % 2 == 0))])  # [1 3 5 7 9]

np.random

  • 生成均匀分布的随机数
    • np.random.rand(size) 范围[0,1) size: 如 2; 如2, 3
    • np.random.randint(low, high, size) 指定范围[low, hight)的随机整数 size如 2; 如(2, 3)
    • np.random.uniform(low, high, size) 指定范围[low, hight)(默认[0,1))随机均匀分布 size如 2; 如(2, 3)
  • 生成正态分布随机数
    • np.random.randn(size) 标准正态分布(均值为0,方差为1) size: 如 2; 如2, 3
    • np.random.normal(loc,scale,size) 指定均值loc和方差scale的一般正态分布

np.around

print(np.around(a, decimals=1))  # 保留一位小数四舍五入   # python基本方法是round
print(np.around(a, decimals=-1))  # 整数个位数四舍五入 -2为十位数  -3为百位数

loadtxt()

data = np.loadtxt('iris_data.csv') # 默认分隔符为空格
posted @ 2022-09-05 10:51  Steven0325  阅读(126)  评论(0编辑  收藏  举报