python-numpy常用操作

在了解numpy前先来了解一下数组:
数组和列表的区别:
- 数组: 存储的时同一种数据类型;
- list:容器, 可以存储任意数据类型;

# 一维数组和数组的计算
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
add = lambda x: x[0] + x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([add(item) for item in zip(a, b)])

mul = lambda x: x[0] * x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([mul(item) for item in zip(a, b)])

不论一维数组还是二维数组都不能直接进行加减乘除运算,需要嵌套for循环很麻烦,这就有了numpy,让数组计算变得简单:

1 什么numpy?

快速, 方便的科学计算基础库(主要时数值的计算, 多维数组的运算);

2 numpy基础概念

  • 轴的理解(axis): 0轴, 1轴, 2轴
  • 一维数组: [1,2,3,45] ----0轴
  • 二维数组: [[1,2,3,45], [1,2,3,45]] ----0轴, 1轴
    在这里插入图片描述
    在这里插入图片描述

3 numpy常用的方法

1. numpy中如何创建数组(矩阵)?

# 方法1:
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5])
c1 = np.array(range(1,6))
print(a+b)

# 方法2:
c2 = np.arange(1,6)
print(c1)
print(c2)
# [1 2 3 4 5]

print(type(c2))
# 类名:numpy.ndarray

print(c2.dtype)
# 元素类型int64

2 修改类型.astype

在这里插入图片描述

print(c.astype('float'))
# [1. 2. 3. 4. 5.]
print(c.astype('bool'))
# [ True  True  True  True  True]
print(c.astype('?'))
# [ True  True  True  True  True]

3. 修改浮点数的小数位数np.round

c3 = np.array([1.234556, 3.45464456, 5.645657567])
print(np.round(c3, 2))    
#[1.23 3.45 5.65]

4 numpy读取操作

eg6-a-student-data.txt这个文档我放在云盘提取码:mys5

import numpy as np

fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
# fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
# dtype: 数据类型, 可选, 默认是float;
# delimiter: 分隔符字符串, 默认情况是任何的空格,
# skiprows: 跳过前xx行, 一般情况跳过第一行;
#  usecols: 读取指定的列, 可以是元组;
# unpack: 如果为True, 对返回的数组对象转置;
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9, usecols=(1, 3), unpack=True)
# loadtxt源代码
# def loadtxt(fname, dtype=float, comments='#', delimiter=None,
#             converters=None, skiprows=0, usecols=None, unpack=False,
#             ndmin=0, encoding='bytes', max_rows=None):
print(data)

输出:

[array([b'M', b'M', b'F', b'M', b'F', b'F', b'M', b'M', b'F', b'F', b'M',
       b'M', b'M', b'F', b'F', b'M', b'F', b'F', b'M'], dtype='|S1'), array([1.82, 1.77, 1.68, 1.72, 1.78, 1.6 , 1.72, 1.83, 1.56, 1.64, 1.63,
       1.67, 1.66, 1.59, 1.7 , 1.97, 1.66, 1.63, 1.69], dtype=float16)]

5 数组的转置

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)
#[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]


# 转置的三种方法
# 1).转置
print(data.transpose())

# 2). 0轴 , 1 轴
print(data.swapaxes(1, 0))

# 3).简写T
print(data.T)

输出:

[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

6numpy切片和索引

import numpy as np
data = np.arange(12).reshape((3,4))
print(data)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

#  第一行
print(data[0])
#  [0 1 2 3]
#
#  第一列
print(data[:,0])
print(data.T[0]) # [0 4 8]
#
#
# #  获取多行
print(data[:2])
# [[0 1 2 3]
#  [4 5 6 7]]
#
#  获取多列的两种方法
print(data)
print(data[:,:2])
# [[0 1]
#  [4 5]
#  [8 9]]

print(data.T[:2])
# [[0 4 8]
#  [1 5 9]]

#  获取指定行的前几列
# 前两行的第一列和第三列
print(data[:2,[0,2]])
# [[0 2]
#  [4 6]]

# 获取第一行和第三行的前两列
print(data[[0,2],:2])
# [[0 1]
#  [8 9]]

7numpy中数值的修改

import numpy as np

# 1.一维---->3行4列
data = np.arange(12).reshape((3,4))
print(data)

# 1第一行数据全为0
data[0] = 0
print(data)

# 2前两列全为0
data.T[:2] = 0
print(data)


# 3data中所有大于10的数字替换为0

print(data>10)
# [[False False False False]
#  [False False False False]
#  [False False False  True]]

data[data>8]=0
print(data)
# [[0 1 2 3]
#  [4 5 6 7]
#  [8 0 0 0]]

# 4 data中所有大于10的数字替换为0,否则替换为1

# 注释掉前面的操作
data[data<=8]=1
data[data>8] =0
print(data)
# [[1 1 1 1]
#  [1 1 1 1]
#  [1 0 0 0]]
# 第二种方法
print(np.where(data<=8,1,0))
# [[1 1 1 1]
#  [1 1 1 1]
#  [1 0 0 0]]


# 裁剪
# 小于等于8的替换为8,大于等于10的替换为10
print(data.clip(8,10))
# [[ 8  8  8  8]
#  [ 8  8  8  8]
#  [ 8  9 10 10]]


# # 数组的拼接
t1 = np.arange(12).reshape(2,6)
t2 = np.arange(12).reshape(2,6)
# 竖直拼接
print(np.vstack((t1,t2)))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]
# 水平拼接
print(np.hstack((t1,t2)))
# [[ 0  1  2  3  4  5  0  1  2  3  4  5]
#  [ 6  7  8  9 10 11  6  7  8  9 10 11]]


# 行交换
t4 = np.arange(12).reshape(2,6)
print(t4)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]
t4[[0,1],:] = t4[[1,0],:]
print(t4)
# [[ 6  7  8  9 10 11]
#  [ 0  1  2  3  4  5]]


# 列交换
t4[:,[0,1]] = t4[:,[1,0]]
print(t4)
# [[ 7  6  8  9 10 11]
#  [ 1  0  2  3  4  5]]

8numpy中最大值、最小值、全为0的数组、全为1的数组、对角线全为1的正方形数组

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
data[0, 0] = 80 #(0,0)处改为80
print(data)
# [[80  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]


# 1. 获取最大值和最小值的位置;
# 获取当前数组里面最大值的索引;
max_item1 = np.argmax(data)
print(max_item1)
# 0

# 获取每一列的最大值对应的索引;
print(np.argmax(data, axis=0))
# [0 2 2 2]

# 获取每一行的最大值对应的索引;
print(np.argmax(data, axis=1))
# [0 3 3]

# 2. 创建一个全为0的数组;
print(np.zeros((3, 3), dtype=np.int))
# [[0 0 0]
#  [0 0 0]
#  [0 0 0]]

# 3. 创建一个全为1的数组;
print(np.ones((3, 4)))
# [[1. 1. 1. 1.]
#  [1. 1. 1. 1.]
#  [1. 1. 1. 1.]]

# 4. 创建一个对角线全为1的正方形数组(方阵)
print(np.eye(3))
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]

9深拷贝与浅拷贝

列表的深拷贝和浅拷贝
- 浅拷贝: a= b[::] a = copy.copy(b)
- 深拷贝: a = copy.deepcopy(b)

  • numpy中的拷贝
    • data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;
    • data2 = data[::], 会创建新的对象data2,
      但是data的数据完全由data2保管, 两个的数据变化是一致的;
    • data3 = data.copy(), 深拷贝, 两个变量不湖影响;
import numpy as np
data = np.arange(8).reshape(2,4)
data
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
data1 = data
id(data)
140444611238448
id(data1)
140444611238448
data2 = data[::]
id(data)
140444611238448
id(data2)
140444621241360
id(data[0])
140444621241200
id(data2[0])
140444620515568
data
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
data2
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
np.where(data2<4,4,10)
array([[ 4,  4,  4,  4],
       [10, 10, 10, 10]])
data2
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
data2[0] = 0
data2
array([[0, 0, 0, 0],
       [4, 5, 6, 7]])
data
array([[0, 0, 0, 0],
       [4, 5, 6, 7]])
data3 = data.copy()
data
array([[0, 0, 0, 0],
       [4, 5, 6, 7]])
data3
array([[0, 0, 0, 0],
       [4, 5, 6, 7]])
data3[0] = 10
data3
array([[10, 10, 10, 10],
       [ 4,  5,  6,  7]])
data
array([[0, 0, 0, 0],
       [4, 5, 6, 7]])

10缺失值nan和负无穷inf

nan(not a number): 表示不是一个数字, 代表的是数据缺失
inf(infinity): inf代表正无穷, -inf代表负无穷

# nan的特殊属性:
    - 两个nan的值是不相等的, 是float类型:
    >>> np.nan == np.nan
    False

    >>> np.nan != np.nan
    True

    - 如何判断有多少个缺失值:

        data = np.arange(12, dtype=np.float).reshape(3, 4)
        data
        array([[ 0.,  1.,  2.,  3.],
               [ 4.,  5.,  6.,  7.],
               [ 8.,  9., 10., 11.]])
        data[:2, 2] = np.nan
        data
        array([[ 0.,  1., nan,  3.],
               [ 4.,  5., nan,  7.],
               [ 8.,  9., 10., 11.]])
        np.count_nonzero(data!=data)
        2
        data!=data
        array([[False, False,  True, False],
               [False, False,  True, False],
               [False, False, False, False]])

        # 判断data里面的缺失值
        np.isnan(data)
        array([[False, False,  True, False],
               [False, False,  True, False],
               [False, False, False, False]])

        np.count_nonzero(np.isnan(data))
        2

    data[np.isnan(data)]=0

11常用统计函数

import numpy as np
data = np.arange(12, dtype=np.float).reshape(3, 4)
print(data.sum())
# 每一列数据的和;
print(data.sum(axis=0))
# 每一行数据的和;
print(data.sum(axis=1))



# - 均值

print(data.mean())
print(data.mean(axis=0))
print(data.mean(axis=1))



# - 中值
print(data)
print(np.median(data))
print(np.median(data, axis=0))
print(np.median(data, axis=1))


# - 最大值
print(data.max())
print(data.max(axis=0))
print(data.max(axis=1))

# - 最小值
# - 极差
print(np.ptp(data))
print(np.ptp(data, axis=0))
print(np.ptp(data, axis=1))


# - 标准差: 代表的是数据的波动稳定情况, 数字越大, 越不稳定;
print(data.std())
print(data.std(axis=0))
print(data.std(axis=1))

猜你喜欢

转载自blog.csdn.net/weixin_43067754/article/details/87899740