Numpy

转自:波哥

1、使用np.array()创建数组

import numpy as np
np.array([1,2,3,4,5])    # 创建一个一维数组
np.array([1,2,3],[4,5,6])  # 创建一个二维数组

# numpy默认ndarray的所有元素类型是相同的
# 如果传进来的列表中包含不同的类型,则统一为统一类型,优先级:str > float > int

2.使用np的函数创建数组

import numpy as np


# np.ones(shape, dtype=None, order='C')
np.ones(shape=(5, 6), dtype=int) # 创建一个元素数值为1, 形状为5行5列的二维数组

# np.zeros(shape, dtype=None, order='C')
np.zeros((5, 5)) # 创建一个元素数值为0, 形状为5行5列的二维数组

# np.full(shape, fill_value, dtype=None, order='C')
np.full((5,5),fill_value=999) # 创建一个元素数值为999, 形状为五行五列的二维数组

# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.linspace(1,100,num=50) # 创建一个元素数值范围在1到100, 元素个数为50的一维数组

# np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0, 100, 2) #创建一个 元素数值范围为0到100,元素数值步长为2 的一维数组

# np.random.randint(low, high=None, size=None, dtype='l')
np.random.seed(1) # 使用random.seed()方法固定随机性
np.random.randint(0, 100, size=(5, 6)) # 生成一个5行6列的二维数组, 每一个元素的值是0到100的随机数

# np.random.randn(d0, d1, ..., dn)
np.random.seed(1) # 固定随机性
np.random.randn(4, 5, 6) # 标准正太分布

# np.random.random(size=None)
np.random.seed(1) # 固定随机性
np.random.random(size=(3, 3)) # 生成0到1的随机数, 左闭右开

3.ndarray的属性

  • 4个必须记住的参数:
    • ndim: 维度
    • shape: 形状(各维度的长度)
    • size: 总长度
    • dtype: 元素类型
# 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片
import matplotlib.pyplot as plt
img_arr = plt.imread('./wnh.jpg') # 读取图片数据,返回一个三维数组
plt.imshow(img_arr) # 显示该图片


img_arr.shape   # 数组的形状
img_arr.size    # 数组的总长度
img_arr.dtype   # 数组元素的类型
img_arr.ndim    # 数组的维度(几维数组)

4.ndarray的基本操作

import numpy as np

np.random.seed(1)
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个元素范围是0到100,形状是5行5列的随机数组
arr
##执行结果如下:
array([[37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87]])

(1)索引

# 根据索引查看元素. 注意:索引从0开始计数.
arr[0][0]


##执行结果如下:
37

# 根据索引修改元素数值
arr[0][0] = 666
arr


##执行结果如下:
array([[666,  12,  72,   9,  75],
       [  5,  79,  64,  16,   1],
       [ 76,  71,   6,  25,  50],
       [ 20,  18,  84,  11,  28],
       [ 29,  14,  50,  68,  87]])


(2)切片

# 查看当前数组
arr


##执行结果如下:
array([[666,  12,  72,   9,  75],
       [  5,  79,  64,  16,   1],
       [ 76,  71,   6,  25,  50],
       [ 20,  18,  84,  11,  28],
       [ 29,  14,  50,  68,  87]])


# 获取二维数组前两行
arr[0:2]


##执行结果如下:
array([[666,  12,  72,   9,  75],
       [  5,  79,  64,  16,   1]])


# 获取二位数组前两列
arr[:,0:2]


##执行结果如下:
array([[666,  12],
       [  5,  79],
       [ 76,  71],
       [ 20,  18],
       [ 29,  14]])

# 注意: 逗号左边是行切片, 右边是列切片
# 获取二维数组前两行和前两列的数据
arr[0:2, 0:2]


##执行结果如下:
array([[666,  12],
       [  5,  79]])

# 将数组的行 倒序排列
arr[::-1,::]


##执行结果如下:
array([[ 29,  14,  50,  68,  87],
       [ 20,  18,  84,  11,  28],
       [ 76,  71,   6,  25,  50],
       [  5,  79,  64,  16,   1],
       [666,  12,  72,   9,  75]])

# 将数组的列 倒序排列
arr[::, ::-1]


##执行结果如下:
array([[ 75,   9,  72,  12, 666],
       [  1,  16,  64,  79,   5],
       [ 50,  25,   6,  71,  76],
       [ 28,  11,  84,  18,  20],
       [ 87,  68,  50,  14,  29]])

# 将数组的行和列 都进行倒序排列
arr[::-1, ::-1]


##执行结果如下:
array([[87, 68, 50, 14, 29],
       [28, 11, 84, 18, 20],
       [50, 25,  6, 71, 76],
       [ 1, 16, 64, 79,  5],
       [75,  9, 72, 12, 37]])

(3)变形

将一维数组变形成多维数组

import numpy as np
arr_1 = np.arange(0, 100, 4) # 创建一个元素范围为0到100,元素步长为4的一维数组

arr_1.reshape((-1, 5)) # 将一维数组变形成多维数组

##执行结果如下:
array([[ 0,  4,  8, 12, 16],
       [20, 24, 28, 32, 36],
       [40, 44, 48, 52, 56],
       [60, 64, 68, 72, 76],
       [80, 84, 88, 92, 96]])

将多维数组变形成一维数组

import numpy as np
np.random.seed(1) # 固定随机性
arr_2 = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组

arr_2 = arr_2.reshape((25,)) # 将多维数组变形成一维数组
arr_2

##执行结果如下:
array([37, 12, 72,  9, 75,  5, 79, 64, 16,  1, 76, 71,  6, 25, 50, 20, 18, 84, 11, 28, 29, 14, 50, 68, 87])

(4)级联

语法: np.concatenate((arr1, arr2), axis=1)

参数:

  • arr1, arr2表示要级联的数组
  • axis=1表示横向级联, axis=0表示纵向级联
import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr


##执行结果如下:
array([[37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87]])
np.concatenate((arr, arr), axis=1) # 将数组arr进行横向级联


##执行结果如下:
array([[37, 12, 72,  9, 75, 37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1,  5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50, 76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28, 20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87, 29, 14, 50, 68, 87]])

 (5)切分

与级联类似, 三个函数完成切分工作:

  • np.split(arr, 行/列号, 轴)
    • 注意: 参数2是一个列表类型
  • np.vsplit()
  • np.hsplit()

(6)副本

import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr


##执行结果如下:
array([[37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87]])

a = arr.copy() # 可以使用copy()函数创建副本,这样做不会对原数据造成影响
a[2][2] = 666 # 修改副本的数据不会对原数据造成影响
arr


##执行结果如下:
array([[37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87]])
a


##执行结果如下:
array([[ 37,  12,  72,   9,  75],
       [  5,  79,  64,  16,   1],
       [ 76,  71, 666,  25,  50],
       [ 20,  18,  84,  11,  28],
       [ 29,  14,  50,  68,  87]])

5.ndarray的聚合操作

(1)求和np.sum()

import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr


##执行结果如下:
array([[37, 12, 72,  9, 75],
       [ 5, 79, 64, 16,  1],
       [76, 71,  6, 25, 50],
       [20, 18, 84, 11, 28],
       [29, 14, 50, 68, 87]])

arr.sum(axis=1) # axis=1 对所有行求和


##执行结果如下:
array([205, 186, 228, 161, 248])

arr.sum(axis=0) # axis=0 对所有列求和


##执行结果如下:
array([167, 215, 276, 129, 241])

(2)最大最小值: np.max()np.min()

arr.max(axis=1) # 求每一行的最大值

arr.max(axis=0) # 求每一列的最大值

arr.min(axis=1) # 求每一行的最小值

arr.min(axis=0) # 求每一列的最小值

(3)平均值: np.mean()

arr.mean(axis=1) # 求每一行的平均值

arr.mean(axis=0) # 求每一列的平均值

(4)其他聚合操作

Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power   幂运算

6.ndarray的排序

快速排序

np.sort()ndarray.sort()都可以, 但有区别:

  • np.sort()不改变输入
  • ndarray.sort()本地处理, 不占用空间, 但改变输入
np.sort(arr, axis=1) # 对每一行进行升序排序

np.sort(arr, axis=0) # 对每一列进行升序排序

 

posted @ 2019-05-14 21:19  一只程序猿呀  阅读(398)  评论(0编辑  收藏  举报