python 第三方库 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]
'''
切片和索引
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]]
'''
'''