引入一下 Numpy
模块, Numpy
的数组使用可以查看一下帮助文档, Numpy
的 array
数组类型必须是一致的(后面会讲)
# 导入Numpy模块import numpy as np
help(np.array) #或者用 np.array? 查看
np.array(list)
注意:
print(np.array([1,2,3,4,5]))
和 np.array([1,2,3,4,5])
在交互摸索下显示是稍微有点区别的,千万别以为是不一样的东西
# 构造一个list1list1 = list(range(10))print(list1)# 通过List创建一个一维数组array1 = np.array(list1)print(array1)type(array1)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0 1 2 3 4 5 6 7 8 9]numpy.ndarray
# 你直接写也一样test_array = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])print(test_array)type(test_array)
[0 1 2 3 4 5 6 7 8 9]numpy.ndarray
# 创建一个嵌套列表list2 = [list1,list1]print(list2)# 通过嵌套列表创建二维数组array2 = np.array(list2)print(array2)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]][[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]]
# 创建3维数组array3 = np.array([ [[1,2,3],[4,5,6],[7,8,9]], [[1,2,3],[4,5,6],[7,8,9]]])print(array3)type(array3)
[[[1 2 3] [4 5 6] [7 8 9]] [[1 2 3] [4 5 6] [7 8 9]]]numpy.ndarray
################### 扩展部分 ######################### 其实你通过元组创建也一样,只是官方演示文档里面用的是list# 逆天推荐使用列表(和官方文档一致嘛)
# 一维数组np.array((1,2,3,4,5))
array([1, 2, 3, 4, 5])
# 都是一个数组,你print和直接输入名字是稍微有点区别的# 千万别以为是不一样东西print(np.array((1,2,3,4,5)))
[1 2 3 4 5]
# 二维数组np.array(((1,2,3),(4,5,6)))
array([[1, 2, 3], [4, 5, 6]])
# 二维数组,这种方式也一样np.array(([1,2,3],[4,5,6]))
array([[1, 2, 3], [4, 5, 6]])
ndim
查看数组维度
shape
查看数组形状
size
查看数组含有多少元素(行*列)
dtype
查看元素的数据类型
help(array2)
# 查看维度print(array1.ndim)print(array2.ndim)print(array3.ndim)
123
# 数组的形状,Tuple类型print(array1.shape)print(array2.shape) # 2行10列print(array3.shape)
(10,)(2, 10)(2, 3, 3)
# 查看总共多少元素(行*列)array2.size
20
# 查看元素的数据类型array2.dtype
dtype('int64')
################### 扩展部分 ########################
# Array元素类型都一致,如果不一致会以最大兼容来初始化np.array([[1,2,3],[4,5,6.0]]) # 都变成Float类型了
array([[1., 2., 3.], [4., 5., 6.]])
# 指定类型np.array([[1,2,3],[4,5,6]],dtype=float)
array([[1., 2., 3.], [4., 5., 6.]])
# 行元素的个数不一致的测试test_list = [[1],[1,2]]print(test_list)test_array = np.array(test_list)print(test_array)print(test_array.dtype) # 全部变成了object
[[1], [1, 2]][list([1]) list([1, 2])]object
range()
返回的是 range
对象,而 np.arange()
返回的是 numpy.ndarray()
两者都可以进行迭代,而 np.nrange
还是一个序列,可被当做向量使用
range()
不支持步长为小数, np.arange()
支持步长为小数
如果这些基础类型还不是很清楚,可以看我之前写的文章:
多维数组创建:(reshape的 行x列 != 元素个数 就会报错)
创建3行5列的数组: np.arange(15).reshape((3,5))
告诉它多少列,自动求行: np.arange(20).reshape((-1,5))
告诉它多少行,自动求列: np.arange(20).reshape((4,-1))
help(np.arange)
list(range(5))
[0, 1, 2, 3, 4]
np.arange(5)
array([0, 1, 2, 3, 4])
type(range(1,10))
range
# 用法和range差不多array1 = np.arange(1,10) # [1,10)print(array1)type(array1)
[1 2 3 4 5 6 7 8 9]numpy.ndarray
# 可以直接迭代for i in array1: print(i,end=' ')
1 2 3 4 5 6 7 8 9
# Python里面的range不支持步长为小数range(1,10,0.5)
---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-27-546bf1d2fbc2> in <module>() 1 # Python里面的range不支持步长为小数----> 2 range(1,10,0.5)TypeError: 'float' object cannot be interpreted as an integer
# 支持步长为小数np.arange(1,10,0.5) # step为0.5
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5])
################### 开始变化 ########################
help(array1.reshape)
# 创建2维数组,参数传元组比较合适(官方案例也是元组)np.arange(1,10,0.5).reshape((2,9))
array([[1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ], [5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5]])
# 3行5列np.arange(15).reshape((3,5))
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
# 告诉它多少列,自动求行np.arange(20).reshape((-1,5))
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
# 告诉它多少行,自动求列np.arange(20).reshape((4,-1))
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
# reshape的 **行x列 != 元素个数** 就会报错np.arange(20).reshape(3,7)
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-35-7050b8704de5> in <module>() 1 # reshape的 **行x列 != 元素个数** 就会报错----> 2 np.arange(20).reshape(3,7)ValueError: cannot reshape array of size 20 into shape (3,7)
np.random.randint
生成给定范围内均匀分布的整数
np.random.rand
生成 [0,1)
之间均匀分布的随机数
np.random.ranf
生成均匀分布的浮点数字 [0.0,1.0)
np.random.randn
生成符合正态分布的随机数
np.random.normal
从正态分布中返回符合你输入的均值与方差以及shape的值
扩展: np.random.seed
设置随机种子,一般不太用,特殊场景需要
# 生成一个给定范围内均匀分布的整数[0,10)np.random.randint(10)
0
# 生成20个在[0,10)的整数np.random.randint(10,size=20)
array([4, 4, 7, 8, 1, 7, 5, 7, 4, 4, 3, 7, 2, 6, 9, 2, 7, 0, 4, 5])
# 生成2*4的数组,取值范围在[0,5)np.random.randint(5, size=(2, 4))
array([[1, 1, 0, 1], [3, 0, 1, 4]])
# 更多可以查看help(np.random.randint)
# 均匀分布的随机数[0,1)np.random.rand(10)
array([0.08996296, 0.82827789, 0.74820873, 0.09045909, 0.26352475, 0.66150275, 0.0038369 , 0.47934078, 0.43417883, 0.05288273])
# 更多可以查看help(np.random.rand)
# 均匀分布的浮点数字[0.0, 1.0)np.random.ranf(10)
array([0.95702794, 0.59910303, 0.73824443, 0.6832429 , 0.64869682, 0.0955835 , 0.99294838, 0.55386257, 0.25567338, 0.95512264])
# 更多可以查看help(np.random.ranf)
# 创建10个符合正态分布的随机数np.random.randn(10)
array([ 1.05768826e+00, -3.95641972e-01, 2.37315110e+00, -6.94658823e-01, 7.70828099e-01, 1.91420905e+00, -1.77742033e+00, 1.87125778e+00, 3.81989892e-01, 1.85276444e-03])
# 更多可以查看help(np.random.randn)
# 符合均值为0,方差为1的正态分布的浮点数np.random.normal()
-0.9892652426992485
# 符合均值为10,方差为100的正态分布的浮点数np.random.normal(10,100)
-39.99076455480153
# 符合均值为10,方差为100,3*2的正态分布矩阵np.random.normal(10,100,(3,2))
array([[106.69681561, -81.35604536], [-22.26387387, 141.78449018], [ 28.3122283 , -96.87127422]])
# 更多可以查看help(np.random.normal)
np.linspace
生成等差数列的数组
和arange不一样的是end值可以取到
help(np.linspace)
# 创建一个从0~10,差值为1的等差数组# 0~10总共11个数(和arange不一样的是end值可以取到)np.linspace(0,10,11)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
# 0~20(总共22个数)差值为2的等差数组np.linspace(0,20,11)
array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.])
# 也可以让end_index取不到np.linspace(0,20,10,endpoint=False)
array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.])
基础用法之前讲过,可以回顾一下:https://www.cnblogs.com/dotnetcrazy/p/9114691.html#2.1.Python
简写: array_name[行,列]
(行列都是从0开始)
其他写法: array_name[行][列]
(Numpy不建议这么写,多维数组用切片的时候语义容易偏差,eg: xx[:2][:2]
)
# 先用熟悉的一维数组array1 = np.arange(10)print(array1)
[0 1 2 3 4 5 6 7 8 9]
# 取第一个元素array1[0]
0
# 取最后一个元素array1[-1]
9
# 取第二个元素array1[1]
1
# 取倒数第二个元素array1[-2]
8
################### 二维数组 ########################
test_array = np.array([[1,2,3],[4,5,6]])print(test_array)
[[1 2 3] [4 5 6]]
# 获取元素4(行列都是从0开始)test_array[1][0] # Numpy不建议这么写
4
# 获取元素4 简写test_array[1,0]
4
# 获取第一行最后一个test_array[0,-1]
3
# 获取最后一行倒数第二个元素test_array[-1,-2]
5
array_name[行切片,列切片]
eg: test_array[1:3,1:3]
==> 取索引为1,2的行;取索引为1,2的列
基础用法之前讲过,可以回顾一下:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#1.7.列表切片
# 先用熟悉的一维数组array1 = np.arange(100)print(array1)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]
# 全部取出来array1[::]
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
# 从索引为1~最后array1[1::]
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
################### 切片开始 ########################
# 从第二个元素取到最后,step为10array1[1::10]
array([ 1, 11, 21, 31, 41, 51, 61, 71, 81, 91])
# [1,5) 从下标1取到下标4,下标为5的取不到array1[1:5]
array([1, 2, 3, 4])
# 取下标为1~倒数第二个元素(end_index取不到)array1[1:-1]
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98])
# 取前10个array1[:10]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 取最后10个,可以理解为从索引-5的元素到最后array1[-10:]
array([90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
# 前11~20(eg:第二页)array1[10:20]
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
# 取80~90(eg:倒数第二页)array1[-20:-10]
array([80, 81, 82, 83, 84, 85, 86, 87, 88, 89])
# 前20个数,每两个取一个(eg:隔行换样式)array1[:20:2]
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
# 所有数每10个取一个(eg:test的时候十里挑一)array1[::10]
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
################### 二维数组 ########################
# 生成一个多维数组test_array = np.arange(15).reshape(3,5)print(test_array)
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
# [行切片,列切片]# 行:取第2行到最后,列:取第3列到最后test_array[1:,2:]
array([[ 7, 8, 9], [12, 13, 14]])
# 所有行,最后一列test_array[:,-1:]
array([[ 4], [ 9], [14]])
# 所有行,索引[0,2)列test_array[:,:2]
array([[ 0, 1], [ 5, 6], [10, 11]])
# 索引1的行,索引1的列test_array[1:2,1:2]
array([[6]])
# 上面的等同于test_array[1][1]print(test_array[1,1])
6
# 取索引为1,2的行;取索引为1,2的列test_array[1:3,1:3]
array([[ 6, 7], [11, 12]])
np.unique
找出其中不重复的元素
np.max
找出其中最大的值
np.min
找出其中最小值
np.sum
求和系列
a = np.random.randint(5,size=(4,5))print(a)
[[3 4 4 2 0] [3 3 2 1 4] [2 4 1 3 4] [2 0 3 3 0]]
# 找出其中不重复的元素np.unique(a)
array([0, 1, 2, 3, 4])
# 找出其中最大的值np.max(a) # 或者:a.max()
4
# 找出第1行最大值np.max(a[0]) # 或者:max(a[0])
4
# 找出第3列最大值np.max(a[:,2]) # 或者:max(a[:,2])
4
print(a)
[[3 4 4 2 0] [3 3 2 1 4] [2 4 1 3 4] [2 0 3 3 0]]
# 找出其中最小值np.min(a) # a.min()
0
# 找出第1行最小值np.min(a[0]) # min(a[0])
0
# 找出第3列最小值np.min(a[:,2]) # min(a[:,2])
1
print(a)
[[3 4 4 2 0] [3 3 2 1 4] [2 4 1 3 4] [2 0 3 3 0]]
np.sum(a)
48
# 注意:这个是每一列分别求和sum(a)
array([10, 11, 10, 9, 8])
# 求第1行和np.sum(a[0]) # sum(a[0])
13
# 求第3列和np.sum(a[:,2]) # sum(a[:,2])
10
以前我们可能使用 pickle来实现,现在直接可以用自带的方法实现,eg:
import picklef = open('x.dat','wb') # 写二进制文件pickle.dump(array2,f) # 把对象array2写入f中f.close()f = open('x.dat','rb') # 读二进制文件temp = pickle.load(f)print(temp)
现在直接调用Numpy里面的方法即可
np.save('file_name',obj)np.load('file_name.npy')
多个文件:推荐用这种指定key的方式 默认以npz结尾:
np.savez('file_name',obj1=obj1,obj2=obj2)temp = np.load('file_name.npz')temp[obj1]temp.close()
也可以用扩展里面的方法
help(np.save)
!ls # 查看下当前目录print(array2)
NumpyBase.ipynb 矩阵系列.ipynb[[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]]
# 把array2对象保存成本地二进制文件(自动以.npy结尾)np.save('bak',array2)
!ls
bak.npy NumpyBase.ipynb 矩阵系列.ipynb
# 读取np.load('bak.npy')
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
################### 多个对象保存 ########################
help(np.savez)
print(array1)print(array2)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99][[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]]
# 推荐用这种指定key的方式 默认以npz结尾np.savez('good',array1=array1,array2=array2)
!ls
bak.npy good.npz NumpyBase.ipynb 矩阵系列.ipynb
temp = np.load('good.npz')
temp['array1']
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
temp['array2']
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
################### 扩展系列 ########################
# 默认以npz结尾np.savez('some',array1,array2)
!ls
bak.npy good.npz NumpyBase.ipynb some.npz 矩阵系列.ipynb
temp = np.load('some.npz')type(temp)
numpy.lib.npyio.NpzFile
# 知道有那些文件名,也就是对应的key了keys = temp.filesprint(keys)
['arr_0', 'arr_1']
# 通过这种方式获取temp[keys[0]]
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
temp[keys[1]]
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
看个图就知道它多文件是啥意思了
concatenate
np.concatenate(tuple,axis=0)
默认是x轴拼接(上下、按照列顺序), axis=1
=> y轴拼接(左右、按照行顺序)
help(np.concatenate)
A = np.random.randint(10,size=(2,3))print(A)
[[8 9 1] [8 9 0]]
# 默认是上下(x轴)拼接,第一个参数是元组np.concatenate((A,A))
array([[8, 9, 1], [8, 9, 0], [8, 9, 1], [8, 9, 0]])
# 左右(沿y轴)拼接np.concatenate((A,A),axis=1)
array([[8, 9, 1, 8, 9, 1], [8, 9, 0, 8, 9, 0]])
注意一点:concatenate只能处理一个维度的,如果维度不同可以使用容错性更强的 vstack
(垂直拼接)和 hstack
(水平拼接)
print(A)print(new_test_array)np.concatenate((A,new_test_array)) # 只能处理一个维度的
[[8 9 1] [8 9 0]]---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-124-1d57e04ff24b> in <module>() 1 print(A)----> 2 print(new_test_array) 3 4 np.concatenate((A,new_test_array)) # 只能处理一个维度的NameError: name 'new_test_array' is not defined
help(np.hstack
print(A)np.hstack((A,A))
[[8 9 1] [8 9 0]]array([[8, 9, 1, 8, 9, 1], [8, 9, 0, 8, 9, 0]])
np.vstack((A,A))
array([[8, 9, 1], [8, 9, 0], [8, 9, 1], [8, 9, 0]])
print(new_test_array)np.hstack((A,new_test_array))
---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-128-2b6aab3c90b4> in <module>()----> 1 print(new_test_array) 2 3 np.hstack((A,new_test_array))NameError: name 'new_test_array' is not defined
# 元素不够也是一样报错的np.vstack((A,new_test_array))
---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-129-97df5d70dcf5> in <module>() 1 # 元素不够也是一样报错的----> 2 np.vstack((A,new_test_array))NameError: name 'new_test_array' is not defined
help(np.vstack)
按行切割 np.split(test_array,[index])
简化: np.vsplit(test_array,[index])
按列切割 np.split(test_array,[index],axis=1)
简化: np.hsplit(test_array,[index])
A = np.random.randint(10,size=10) # np.arange(10)print(A)
[2 9 3 9 1 5 7 4 0 0]
a,b = np.split(A,[2])print(a)print(b)
[2 9][3 9 1 5 7 4 0 0]
# 索引2、4分割a,b,c = np.split(A,[2,4])print(a)print(b)print(c)
[2 9][3 9][1 5 7 4 0 0]
################### 多维系列 ########################
test_array = np.random.randint(10,size=(4,5))print(test_array)
[[4 6 2 2 2] [0 7 7 9 1] [5 1 1 3 6] [9 0 5 0 1]]
# 按行切割a,b = np.split(test_array,[1])print(a)print(b)
[[4 6 2 2 2]][[0 7 7 9 1] [5 1 1 3 6] [9 0 5 0 1]]
# 简化写法a,b = np.vsplit(test_array,[1])print(a)print(b)
[[4 6 2 2 2]][[0 7 7 9 1] [5 1 1 3 6] [9 0 5 0 1]]
# 按列切割a,b = np.split(test_array,[1],axis=1)print(a)print(b)
[[4] [0] [5] [9]][[6 2 2 2] [7 7 9 1] [1 1 3 6] [0 5 0 1]]
# 简化写法a,b = np.hsplit(test_array,[1])print(a)print(b)
[[4] [0] [5] [9]][[6 2 2 2] [7 7 9 1] [1 1 3 6] [0 5 0 1]]
help(np.split)
np.copy
我们先来看看为什么要用copy
test_list = list(range(10))print(test_list)# 在Python中切片是不改变原列表的new_test_list = test_list[:5]print(test_list)print(new_test_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4]
# 修改切片出来的列表不影响原列表new_test_list[0] = 22print(test_list)print(new_test_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][22, 1, 2, 3, 4]
# 再看看Numpy的数组test_array = np.random.randint(10,size=(3,5))print(test_array)new_test_array = test_array[:2,:2]print(new_test_array)print(test_array)
[[5 5 2 6 6] [1 2 2 4 8] [8 4 2 5 8]][[5 5] [1 2]][[5 5 2 6 6] [1 2 2 4 8] [8 4 2 5 8]]
# Numpy只要效率,所以不是真的给你切出新数组new_test_array[0,0]=22print(new_test_array)print(test_array)
[[22 5] [ 1 2]][[22 5 2 6 6] [ 1 2 2 4 8] [ 8 4 2 5 8]]
################### Copy登场 ########################
print(test_array)temp = test_array.copy()new_test_array = temp[:2,:2]print(new_test_array)
[[22 5 2 6 6] [ 1 2 2 4 8] [ 8 4 2 5 8]][[22 5] [ 1 2]]
# 验证一下是不是真的copy,的确是真copynew_test_array[0,0] = 6print(new_test_array)print(test_array)
[[6 5] [1 2]][[22 5 2 6 6] [ 1 2 2 4 8] [ 8 4 2 5 8]]
还有什么补充以后就添加在这(有更新欢迎到原文链接查看)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。