无权限

Derrick博客站

【NumPy】基础与数组创建

一、什么是Numpy

numpy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

二、ndarray的限制

  • 数组的所有元素必须具有相同的数据类型。

  • 一旦创建,数组的总大小就不能改变。

  • 形状必须是“矩形”,而不是“锯齿状”。例如二维数组的每一行必须具有相同的列数。

三、ndarray的属性

(1)在Pycharm中要使用数组必须先安装numpy包
图片#642px #479px #B
(2)如果在Pycharm中安装不上,可以考虑用cmd命令
  第一步conda env list
  第二步conda activate numpy-pandas
  第三步conda install numpy
图片#572px #157px #B

(3)ndarray的常见属性

import numpy as np # 导入numpy

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

print(arr)
print(arr.ndim)  # 数组的维度,2
print(arr.shape)  # 数组的形状,(2,3)
print(arr.size)  # 数组的元素个数,6
print(arr.dtype)  # 数组的元素类型,int64
print(arr.itemsize)  # 数组中每一个元素的字节大小,8

四、ndarray的创建方式

1、array()和asarray()

  array():将输入数据转换为ndarray,会进行copy。
  asarray():将输入数据转换为ndarray,如果输入本身是ndarray则不会进行copy。

import numpy as np

arr1 = np.array([1,2,3]) # 使用array()函数创建arr1数组
print(f"arr1的内存地址为{id(arr1)}")

arr2 = np.array(arr1) # 使用array()函数基于arr1创建arr2数组
print(f"arr2的内存地址为{id(arr2)}")

arr3 = np.asarray(arr1) # 使用asarray()函数基于arr1创建arr3数组
print(f"arr3的内存地址为{id(arr3)}")
【运行结果】
arr1的内存地址为1151335438480
arr2的内存地址为1151335438096
arr3的内存地址为1151335438480
  • 发现arr1和arr3的内存地址一模一样,说明创建数组的时候,如果本身提供的就是数组,那么array()和asarray()最大的区别就是一个是创建,一个复制

2、zeros()、ones()、emptys()

  zeros():返回给定形状和类型的新数组,用0填充。
  ones():返回给定形状和类型的新数组,用1填充。
  empty():返回给定形状和类型的未初始化的新数组。(这个值是任意的)

  这三个方法默认都是float64

import numpy as np

arr1 = np.zeros((2,4)) # 创建2行4列的数组,用0填充
print(arr1)
【运行结果】
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]

 


  zeros_like():返回与给定数组具有相同形状和类型的0新数组。
  ones_like():返回与给定数组具有相同形状和类型的1新数组。
  empty_like():返回与给定数组具有相同形状和类型的未初始化的数组。

import numpy as np

arr1 = np.zeros((2,4)) # 创建2行4列的数组,用0填充
arr2 = np.zeros_like(arr1)
print(arr2)
【运行结果】
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]

3、full()与full_like()

  full():返回给定形状和类型的新数组,用指定的值填充。
  full_like():返回与给定数组具有相同形状和类型的用指定值填充的新数组。

import numpy as np

arr1 = np.full((2,3),5)
print(arr1)

arr2 = np.full_like(arr1,9)
print(arr2)
【运行结果】
[[5 5 5]
[5 5 5]]
[[9 9 9]
[9 9 9]]

4、arange()

  arange():返回在给定范围内用均匀间隔的值填充的一维数组。

import numpy as np

arr1 = np.arange(0,10,2)
print(arr1)
【运行结果】
[0 2 4 6 8]

5、linspace()和logspace()

  • linspace()

    • 描述:返回指定范围和元素个数的等差数列。数组元素类型默认为浮点型。

    • 基本语法:linspace(start,stop,num,endpoint,dtype)

    • 注意事项:num表数组数量,endpoint为空默认是true,表示包括stop,若为false则为不包括stop

      import numpy as np
      
      arr1 = np.linspace(0,10,5)
      print(arr1)
      
      arr2 = np.linspace(0,10,5,endpoint=False)
      print(arr2)

      【运行结果】
      [ 0. 2.5 5. 7.5 10. ]
      [0. 2. 4. 6. 8.]

  • logspace()

    • 描述:返回指定指数范围、元素个数、底数的等比数列。数组元素类型默认为浮点型。

    • 基本语法:logspace(start,stop,num,endpoint,base,dtype)

    • 注意事项:num表数组数量,endpoint为空默认是true,表示包括stop,若为false则为不包括stop,base表示底数

      import numpy as np
      
      arr1 = np.logspace(2,5,4,base=2)
      print(arr1)

      【运行结果】
      [ 4. 8. 16. 32.]

6、创建随机数数组

  • random.rand()

    • 功能:返回给定形状的数组,用 [0, 1) 上均匀分布的随机样本填充。

      import numpy as np
      
      arr = np.random.rand(2,3)
      print(arr)

      【运行结果】
      [[0.85337406 0.67349301 0.76903317]
      [0.25514001 0.47133749 0.19264306]]

  • random.randint()

    • 功能:返回给定形状的数组,用从低位(包含)到高位(不包含)上均匀分布的随机整数填充。

      import numpy as np
      
      arr = np.random.randint(1,10,(2,3))
      print(arr)

      【运行结果】
      [[7 3 1]
      [5 4 3]]

 

五、ndarray的数据类型

  • 创建数组时可以使用dtype参数指定元素类型

    arr1 = np.array([1,2,3],dtype=np.float64)
    print(arr1)

  • 也可以使用ndarray.astype()方法转换数组的元素类型:

    arr2 = arr1.astype(np.int64)
    print(arr2)

六、ndarray切片和索引

  • 获取索引为2的数据

    import numpy as np
    arr = np.arange(0,21,2)
    print(arr[2])

  • 从索引2开始到索引9(不包含)停止,间隔为2

    print(arr[2:9:2])

  • 从索引2开始到最后,默认间隔为1

    print(arr[2:])

  • 从索引2开始到索引9(不包含)结束,默认间隔为1

    print(arr[2:9])

七、numpy常见函数

(一)基本函数

  • 1、np.abs() 元素的绝对值

    import numpy as np
    
    arr = np.array([2,3,5,-2,-5,3])
    print(arr)
    print(np.abs(arr))

    【运行结果】
    [ 2 3 5 -2 -5 3]
    [2 3 5 2 5 3]

  • 2、np.ceil() 向上取整

    import numpy as np
    
    arr = np.array([1.1,2.2,3.3,4.4,5.5,6.6])
    print(arr)
    print(np.ceil(arr))

    【运行结果】
    [1.1 2.2 3.3 4.4 5.5 6.6]
    [2. 3. 4. 5. 6. 7.]

  • 3、np.floor() 向下取整

    import numpy as np
    
    arr = np.array([1.1,2.2,3.3,4.4,5.5,6.6])
    print(arr)
    print(np.floor(arr))

    【运行结果】
    [1.1 2.2 3.3 4.4 5.5 6.6]
    [1. 2. 3. 4. 5. 6.]

  • 4、np.rint()四舍五入

    import numpy as np
    
    arr = np.array([1.1,2.2,3.3,4.4,5.5,6.6])
    print(arr)
    print(np.rint(arr))

    【运行结果】
    [1.1 2.2 3.3 4.4 5.5 6.6]
    [1. 2. 3. 4. 6. 7.]

  • 5、np.multiply() 元素相乘

    import numpy as np
    
    arr = np.array([[1,2],[3,4]])
    print(arr)
    print(np.multiply(arr, arr))

    【运行结果】
    [[1 2]
    [3 4]]
    [[ 1 4]
    [ 9 16]]

 

  • 6、np.divide() 元素相除

    import numpy as np
    
    arr = np.array([[1,2],[3,4]])
    print(arr)
    print(np.divide(arr, 2))

    【运行结果】
    [[1 2]
    [3 4]]
    [[0.5 1. ]
    [1.5 2. ]]

  • 7、np.where(condition, x, y) 三元运算符

    import numpy as np
    
    arr = np.array([1,2,3,4])
    print(np.where(arr>2,66,55))

    运行结果
    [55 55 66 66]

(二)统计函数

图片#682px #429px #B

(三)比较函数

图片#677px #120px #B

import numpy as np

arr = np.array([4,1,9,63,12,47,10,6])
print(np.any(arr>=63))
print(np.all(arr>=63))
【运行结果】
True
False

 

(四)排序函数

  • 默认排序(axis=1):按行排序

    import numpy as np
    
    arr = np.array([[1,2,6],[6,3,4],[9,1,3]])
    arr.sort()
    print(arr)

    【运行结果】
    [[1 2 6]
    [3 4 6]
    [1 3 9]]

  • axis=1排序:案列排序

    import numpy as np
    
    arr = np.array([[1,2,6],[6,3,4],[9,1,3]])
    arr.sort(axis=0)
    print(arr)

    【运行结果】
    [[1 1 3]
    [6 2 4]
    [9 3 6]]

(五)去重函数

  • 计算唯一值并返回有序结果。

    import numpy as np
    
    arr1 = np.random.randint(0, 5, (3, 3))
    print(arr1)
    print(np.unique(arr1))

    【运行结果】
    [[2 0 0]
    [3 0 2]
    [0 3 0]]
    [0 2 3]

八、基本运算

1、数组与数组之间的运算

import numpy as np

arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[4,5,6],[1,2,3]])

print( arr1 + arr2 )
print( arr1 - arr2 )
print( arr1 * arr2 )
print( arr1 / arr2 )
【运行结果】
[[5 7 9]
[5 7 9]]
[[-3 -3 -3]
[ 3 3 3]]
[[ 4 10 18]
[ 4 10 18]]
[[0.25 0.4 0.5 ]
[4. 2.5 2. ]]

2、数组与标量之间的运算

import numpy as np

arr1 = np.array([[1,2,3],[4,5,6]])

print( arr1 + 100 )
print( arr1 - 100 )
print( arr1 * 100 )
print( arr1 / 100 )
【运行结果】
[[101 102 103]
[104 105 106]]
[[-99 -98 -97]
[-96 -95 -94]]
[[100 200 300]
[400 500 600]]
[[0.01 0.02 0.03]
[0.04 0.05 0.06]]

3、numpy数组的广播规则:为了让不同形状的数组可以运算

  • 规则1:维度对齐,小维数组左侧补1

    • 例如:第一个数组是一维数组(3,),第二个数组是二维数组(3,1),那么第一个一维数组会左侧补1,变成(1,3)

  • 规则2:同维数组,尺寸拓展(1变多)

    • 例如:第一个数组是二维数组 (1,3),第二个数组是二维数组(3,1),那么两个数组都会变成(3,3)

  • 规则3: 冲突报错(不是1)

    • 例如:形状(2,3)的数组无法与形状(3,2)的数组直接进行元素级运算

 

九、矩阵乘法

import numpy as np
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[1,3],[4,6],[7,8]])

print(np.dot(arr1,arr2))
【运行结果】
[[30 39]
[66 90]]

 

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册