day4-numpy进阶


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 方法:

两个方法都是将多维数组转换为一维数组,但是有以下不同:

  1. flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组。
  2. 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. ]])
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值