文章目录
numpy进阶
1 修改数组的维度
ndarray.reshape(shape, order)
- 返回一个具有相同数据域,但shape不一样的视图
- 行、列不进行互换
reshape和resize方法:
# reshape 不会影响原数组本身
array2=array1.reshape((2,6)) # 2*6=12个数,数不能不对应
array2
# resize 修改数据的形状是基于原对象做修改的
array3 = np.random.randint(2, 4, size=(3, 4))
result = array3.resize((2, 6)) # 没有返回值
print(result)
flatten 和 ravel 方法:
两个方法都是将多维数组转换为一维数组,但是有以下不同:
flatten
是将数组转换为一维数组后,然后将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组。ravel
是将数组转换为一维数组后,将这个视图(可以理解为引用)返回回去,所以后续对这个返回值进行修改会影响之前的数组。
2 数组操作
2.1 索引和切片
一维、二维、三维的数组
- 直接进行索引,切片
- 对象[:, :] – 先行后列
data_list = [
[
[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]
],
[
[80, 89, 11, 67, 79],
[78, 97, 22, 67, 81],
[90, 94, 33, 67, 74],
[91, 91, 44, 67, 69],
[76, 87, 55, 67, 86],
[70, 79, 66, 67, 84],
[94, 92, 77, 67, 64],
[86, 85, 88, 67, 80]
]
]
score= np.array(data_list)
2.2数据分割
hsplit
:按照水平方向进行切割。用于指定分割成几列,可以使用数字来代表分成几部分,也可以使用数组来代表分割的地方。示例代码如下:
a1 = np.arange(0, 12).reshape(2, 6)
a1
# hsplit 水平按列进行分割 horizontally
res1,res2=np.hsplit(a1,2)#平分成两份,这个思维是纵向分割了,不懂,不懂
print(res1)
print(res2)
res = np.hsplit(a1, [2]) # 可以在列表中指定索引位置分割
res
a1 = np.arange(16).reshape(4, 4)
a1
a1 = np.arange(0, 12).reshape(2, 6)
a1
输出结果
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
2.3垂直按行分割
vsplit
:按照垂直方向进行切割。用于指定分割成几行,可以使用数字来代表分成几部分,也可以使用数组来代表分割的地方。
np.vsplit(a1, 2)
#结果
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
np.vsplit(a1, [1, 2])
# 结果
[array([[0, 1, 2, 3]]),
array([[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a
10525c1ecb4c98b0accdd69e7a5d00.png)
2.4数据拼接
vstack
:将数组按垂直方向进行叠加。数组的列数必须相同才能叠加。
import numpy as np
a1 = np.arange(0, 10).reshape(2, 5)
a2 = np.arange(10, 20).reshape(2, 5)
print('a1:\n', a1)
print('a2:\n', a2)
v_a3 = np.vstack([a1, a2])
print('v_a3:\n', v_a3)
"""
a1:
[[0 1 2 3 4]
[5 6 7 8 9]]
a2:
[[10 11 12 13 14]
[15 16 17 18 19]]
v_a3:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
"""
hstack
:将数组按水平方向进行叠加。数组的行必须相同才能叠加。
h_a3 = np.hstack([a1, a2])
print('h_a3:\n', h_a3)
"""
h_a3:
[[ 0 1 2 3 4 10 11 12 13 14]
[ 5 6 7 8 9 15 16 17 18 19]]
"""
3 数据广播
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。
arr1 = np.array([[0], [1], [2], [3]])
arr1.shape
# (4, 1)
arr2 = np.array([1, 2, 3])
arr2.shape
# (3,)
arr1+arr2
# 结果是:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
- 1.数组的某一维度等长。
- 2.其中一个数组的某一维度为1 。但是一旦出现了在某个维度下两个数据宽度不相等,并且两者全不为1的状况,就无法广播
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
4 文件操作
保存文件
arr2 = np.random.randint(1, 10, size=(5, 4))
# 指定分隔符保存
np.savetxt('a.csv', arr2, fmt='%d', delimiter=',')
读取文件
arr3 = np.loadtxt('a.csv', dtype=int, delimiter=',')
arr3
5 Axis
Axis
概念:最外面的括号代表着 axis=0,依次往里的括号对应的 axis 的计数就依次加 1。
最外面的括号就是axis=0
,里面两个子括号axis=1
。 操作方式:如果指定轴进行相关的操作,那么他会使用轴下的每个直接子元素的第0个,第1个,第2个…分别进行相关的操作。
arr = np.array(
[
[1,1,1,1,1,1],
[2,2,2,2,2,2],
[3,3,3,3,3,3],
[4,4,4,4,4,4],
]
)
arr
arr.sum() # 默认情况下会将数组中所有数字求和
#结果输出 60
# 针对二维数据, 绝大多数方法, axis=0 按照列进行计算
# 按照 " 列 "
arr.sum(axis=0)
# 针对二维数据, 绝大多数方法, axis=1 按照行进行计算
arr.sum(axis=1)
6 花哨索引
先了解缺失值
arr = np.random.randint(0, 10, size=(3, 5)).astype(float)
arr[0, 1] = np.nan
arr[1, 2] = np.nan
arr
lines = np.where(np.isnan(arr))[0] # 获取到有缺失值的行
lines
6.1填充缺失值
这里我们提前准备一份csv文件
"""填充缺失值"""
# nan_scores.csv 里面有空值,不能统一数据类型
score = np.loadtxt('../nan_scores.csv', skiprows=1, dtype=str, delimiter=',', encoding='utf-8')
score
score[score == '']=np.nan#花哨索引
score
score=score.astype(float)
score
6.2对缺失值填充平均值
我们先了解np.nanmean
语法
Signature:
np.nanmean(
a,
axis=None,
dtype=None,
out=None,
keepdims=<no value>,
*,
where=<no value>,
)
Call signature: np.nanmean(*args, **kwargs)
Type: _ArrayFunctionDispatcher
String form: <function nanmean at 0x00000148BA8A3D90>
File: d:\miniconda3\lib\site-packages\numpy\lib\nanfunctions.py
Returns
-------
m : ndarray, see dtype parameter above
If `out=None`, returns a new array containing the mean values,
otherwise a reference to the output array is returned. Nan is
returned for slices that contain only NaNs.
See Also
--------
average : Weighted average
mean : Arithmetic mean taken while not ignoring NaNs
var, nanvar
Examples
--------
>>> a = np.array([[1, np.nan], [3, 4]])
>>> np.nanmean(a)
2.6666666666666665
>>> np.nanmean(a, axis=0)
array([2., 4.])
>>> np.nanmean(a, axis=1)
array([1., 3.5]) # may vary
Class docstring:
Class to wrap functions with checks for __array_function__ overrides.
All arguments are required, and can only be passed by position.
"""对缺失值填充平均值"""
mean_result = np.nanmean(score)
for x in range(score.shape[0]):
score[score!=score] = mean_result
score
#输出结果如下:
array([[59. , 89. ],
[90. , 32. ],
[78. , 45. ],
[34. , 56.2],
[56.2, 56. ],
[23. , 56. ]])