【python第三方库】Numpy

python 第三方库 Numpy

(NumPy 参考手册 | NumPy)

ndarray对象

ndarray对象是numpy中用于存放同类型元素的多维数组

ndarray中的对象每个元素在内存中都有相同的储存大小的区域,因为数据类型相同

使用np.array()创建数组类型

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

  • object 存放的数据
  • dtype 数据类型
  • ndmin最小维度
import numpy as np

arry = np.array([1,2,3,4,5,6],dtype=np.int32,ndmin=2)
print(arry) #[[1 2 3 4 5 6]]

数据类型

主要但不限于以下类型

  • 布尔类型 bool True\False
  • int_ 默认整数类型 int32或者 int64
  • float_ float64
  • complex_ complex128
  • uint8 无符号整数 0-255
  • uint32 无符号整数
  • float32 一个符号位 8个指数位 23个尾数位
  • ·······

数组属性

  • ndim 数组的维度数
  • shape 数组形状 每个轴上的大小
  • size 元素个数
  • dtype 数组类型
li = [
    [[1., 1. ,1., 1.],
  [1., 1., 1., 1.],
  [1., 1., 1., 1.]],
 [[1. ,1. ,1., 1.],
  [1. ,1., 1., 1.],
  [1. ,1. ,1. ,1.]]
 ]
arry = np.array(li)
print(arry.ndim) 
print(arry.size)
print(arry.shape)
print(arry.dtype)
'''
3
24
(2, 3, 4)
float64'''

创建数组

  • numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

  • empty 创建指定形状,指定类型的未初始化的数组 空的数组

  • zeros 指定形状 指定类型 使用1填充

  • ones 指定形状 指定类型 用0填充

  • zeros_like 创建和传入数组形状相同的数组,用0填充

    numpy.zeros_like(a, dtype=None, order=‘K’, subok=True, shape=None)

  • ones_like用1填充

    numpy.ones_like(a, dtype=None, order=‘K’, subok=True, shape=None)

print(np.empty((3,3)))
'''
[[0.000e+000 0.000e+000 0.000e+000]
 [0.000e+000 0.000e+000 2.787e-321]
 [0.000e+000 0.000e+000 0.000e+000]]'''
print(np.zeros((3,3)))
'''
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]'''
print(np.ones((3,3)))
'''[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]'''
print(np.zeros_like(li))
'''
[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]
'''
print(np.ones_like(li))
'''[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]'''

从已有的数组创建数组

  • asarray 创建形状相同的数组,默认数据类型相同,可以指定类型

    numpy.asarray(a, dtype = None, order = None)

  • frombuffer 以流的形式读入转化位ndarray对象

    numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

  • frommiter 从迭代对象创建数组

    numpy.fromiter(iterable, dtype, count=-1) count 读取的数据量 -1 全部

arr1 = np.asarray(li)
arr2 = np.fromiter((i for i in range(10)),dtype=np.int32)
'''
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]

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

数值范围创建数组

  • arange 类似range函数

    numpy.arange(start, stop, step, dtype)

  • linspace等差数列

    np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) endpoint 是否包含stop retstep 是否生成间距

  • logspace 等比数列

    np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) base对数log的底数

arr1 = np.arange(0,10,2,dtype=np.int32)
arr2 = np.linspace(10,20,5,endpoint=True,dtype=np.int32)
arr3 = np.logspace(10,20,10,dtype=np.float32)
'''
[0 2 4 6 8] 

[10 12 15 17 20]

[1.00000000e+10 1.29154966e+11 1.66810052e+12 2.15443466e+13
 2.78255932e+14 3.59381362e+15 4.64158877e+16 5.99484251e+17
 7.74263664e+18 1.00000002e+20]
'''

切片和索引

(索引 | NumPy)

ndarry的切片和索引和list列表类型相同

使用[start:stop:step]进行切片和索引

arr = np.arange(0,20)
arr.shape = (2,2,5) # 2个2行5列的数组
print(arr)
'''
[[[ 0  1  2  3  4]  
  [ 5  6  7  8  9]] 
 
 [[10 11 12 13 14]  
  [15 16 17 18 19]]]'''

#索引切片
print(arr[:1])  #选取第一个
'''
[[[0 1 2 3 4]
  [5 6 7 8 9]]]'''
print(arr[...,0:2]) #...代指前面所有维度 这里0:2索引的是最里层,如第一个数组,第一行 0,1列 
'''
[[[ 0  1]
  [ 5  6]]

 [[10 11]
  [15 16]]]'''

高级索引

  • 整数数组索引
    • 使用一个数组来访问另一个数组的元素,数组的元素对应了另一个数组的不同维度的索引
    • 可以使用:...和索引数组结合
# 整数索引
print(arr[
  [1,1,1],
  [0,0,0],
  [1,2,3]
])
'''[11 12 13]'''

arr = np.arange(6)
arr.shape = (2,3)
print(arr[
  [1,0],
  [0,2]
])
'''[3 2]'''
print(arr[
    0,
    :2
])
'''[0 1]'''
  • 花式索引
    • 利用整数数组进行索引
    • 根据索引数组的值作为目标数组对应维度的下标来取值
    • 切片是引用,花式索引是复制
arr = np.arange(12)
print(arr[
  [2,1,7]
])#[2 1 7]
arr.shape = (3,4)
# print(arr)
'''[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]'''
print(arr[
  [2,1,1,0], # 行索引
  [0,2,0,1] # 列索引
]) #[8 6 4 1]
print(arr[
  [2,1,1,0] # 行
]) 
'''
[[ 8  9 10 11]
 [ 4  5  6  7]
 [ 4  5  6  7]
 [ 0  1  2  3]]
'''
arr = np.arange(12).reshape(2,2,3)
print(arr)
'''
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
'''
print(arr[
  [1,0], # 最外层
  [1,0], # 第二维
  [2,1] # 最里层
])# [11  1]
print(arr[
  [1,0],
  [0,1]
])
'''
[[6 7 8]
 [3 4 5]]
'''

# 多个数组需要使用np.ix
arr = np.arange(12).reshape(3,4)
print(arr[np.ix_([1,2],[2,1])]) # 笛卡尔积  1,2  1,1  2,2  2,1
'''
[[ 6  5]
 [10  9]]
'''
  • 布尔索引
    • 筛选数组中符合条件的元素
arr = np.arange(12)
arr = arr[arr%2==0] # [ 0  2  4  6  8 10]

数组操作

  • reshape 修改数组形状 返回新数组
  • flat 数组元素迭代器
  • flatten返回数组的拷贝 展平
  • concatenate连接数组
  • transpose转换数组
  • T 转置
  • ravel 转化为一维数组 原数组的视图
  • hstack 水平堆叠 水平相连
  • vstack 垂直堆叠 垂直相连
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

result = np.hstack((a, b))
print(result)  # [1, 2, 3, 4, 5, 6]


# 使用 hstack 沿着第二轴堆叠
C = np.hstack((A, B))  # 合并后的数组行数不变
print(C) 
# 输出:
# [[1 2 5 6]
#  [3 4 7 8]]

print(np.vstack((a,b)))  
print(np.vstack((A,B))) # 列数不变
'''
[[1 2 3]
 [4 5 6]]
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
'''

arr = np.arange(12).reshape(4,3)
# print(arr)
# print(arr.T)
# print(arr.transpose())
# print(arr.transpose(1,0))
'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
[[ 0  3  6  9]
 [ 1  4  7 10]
 [ 2  5  8 11]]
[[ 0  3  6  9]
 [ 1  4  7 10]
 [ 2  5  8 11]]
[[ 0  3  6  9]
 [ 1  4  7 10]
 [ 2  5  8 11]]
'''
arr = arr.reshape(2,2,3)
print(arr)
'''
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
'''
print(arr.transpose(2,0,1))
'''
[[[ 0  3]
  [ 6  9]]

 [[ 1  4]
  [ 7 10]]

 [[ 2  5]
  [ 8 11]]]
'''
print(np.concatenate((a,b))) 
print(np.concatenate((A,B),axis=0))  # vstack  垂直堆叠  列不变
print(np.concatenate((A,B),axis=1))  # hstack  水平堆叠  行不变
'''
[1 2 3 4 5 6]
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
[[1 2 5 6]
 [3 4 7 8]]
'''
print(np.concatenate((A,B),axis=0).flatten())
print(np.concatenate((A,B),axis=0).ravel())
'''
[1 2 3 4 5 6 7 8]
[1 2 3 4 5 6 7 8]
'''


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

# print(np.split(arr1,2,axis=1))
'''
[array([[0, 1],
       [4, 5],
       [8, 9]]), 
       array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
'''
# print(np.split(arr1,[1,2],axis=1))  # 指定位置切割[1,3]  第二行 和 第四行 前一个分组不包含分隔位置的列
'''
[array([[0],
       [4],
       [8]]), 
       array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]]), 
       array([[ 3],
       [ 7],
       [11]])]
'''
arr2 = arr1.T
# print(arr1)
# print(arr2)
'''
[[ 0  1  2  3] 
 [ 4  5  6  7] 
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
'''
print(np.vsplit(arr2,2))  #   split axis = 0
print(np.hsplit(arr1,2))  #   split axis = 1
'''
[array([[0, 4, 8],
       [1, 5, 9]]), 
       array([[ 2,  6, 10],
       [ 3,  7, 11]])]
[array([[0, 1],
       [4, 5],
       [8, 9]]), 
       array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])

# 使用 flatten()
b = a.flatten()
print("Original array:\n", a)
print("Flattened array (copy):\n", b)

# 修改 b 不会影响 a
b[0] = 100
print("Modified flattened array (copy):\n", b)
print("Original array (unchanged):\n", a)

# 使用 ravel()
c = a.ravel()
print("Raveled array (view):\n", c)

# 修改 c 会间接影响 a
c[0] = 200
print("Modified raveled array (view):\n", c)
print("Original array (changed):\n", a)
'''
Original array:
 [[1 2]
 [3 4]]
Flattened array (copy):
 [1 2 3 4]
Modified flattened array (copy):
 [100   2   3   4]
Original array (unchanged):
 [[1 2]
 [3 4]]
Raveled array (view):
 [1 2 3 4]
Modified raveled array (view):
 [200   2   3   4]
Original array (changed):
 [[200   2]
 [  3   4]]

'''
'''

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值