NumPy--reshape、切片操作、copy函数

⛳reshape方法和flatten、ravel方法

  • reshape用于改变数组的形状和维度
  • flatten 用于将多维数组展平为一维数组。该方法返回一个新的一维数组,其中包含了原始数组中的所有元素,按照原始数组的元素顺序排列。
  • 注意
    • reshape方法返回的是一个新的数组对象,原始数组并没有被修改。
    • flatten方法返回的是一个新的数组对象,原始数组并没有被修改。
    • ravel方法将多维数组展平为一维数组,返回的结果是原数组的视图(view),也就是共享内存的方式,因此对返回的结果进行修改会影响原数组。如果需要得到展平后的数组的副本,可以使用flatten方法。
    • 如果需要对原始数组进行就地修改,可以将返回的值重新赋值给原变量
  • flatten和ravel的区别
    • ravelflatten都是用于将多维数组展平为一维数组的方法,但它们之间有一些区别:
      1. 返回值类型:ravel返回的是原数组的视图(view),如果修改了展平后的数组,原数组也会受到影响;而flatten返回的是展平后的数组的副本(copy),修改展平后的数组不会影响原数组。
      2. 内存管理:ravel方法返回的是数组的视图,因此不需要额外的内存空间;而flatten方法返回的是数组的副本,需要分配额外的内存空间。
      3. 性能:由于ravel返回的是数组的视图,因此执行速度较快;而flatten返回的是副本,因此执行速度较慢。

总的来说,如果你只需要展平数组,并且不需要修改原数组,那么可以使用flatten方法;如果你希望在展平后的数组上进行修改,并且希望修改反映到原数组上,那么可以使用ravel方法。

实战–reshape、flatten、ravel

# coding: utf-8  
  
import numpy as np  
  
# 创建一维的数组  
a = np.arange(24)  
print(a)  
print('数组a的维度', a.shape)  
print('_'*30)  
  
# 使用reshape将一维数组变成三维数组  
b = a.reshape((2, 3, 4))  
print(b)  
print('数组b的维度;', b.shape)  
print('_'*30)  
  
# 将a变成二维数组  
c = a.reshape(3, 8)  
print(c)  
print('数组c的维度:', c.shape)  
print('_'*30)  
  
# 使用ravel函数将三维的b变成一维的数组  
a1 = b.ravel()  
print(a1)  
print('_'*30)  
  
# 使用flatten函数将二维的c变成一维的数组  
a2 = c.flatten()  
print(a2)  
print('_'*30)

result:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
数组a的维度 (24,)
______________________________
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
数组b的维度; (2, 3, 4)
______________________________
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]]
数组c的维度: (3, 8)
______________________________
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
______________________________
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
______________________________

进程已结束,退出代码0

⛳数组的切片(slice)的copy

  • ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中list的切片操作一样。
  • ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop及step 参数进行,从原数组中切割出一个新数组。
  • 在NumPy中,可以使用copy方法创建数组的副本。copy方法用于创建原数组的一个深拷贝,即创建一个新的数组,并复制原数组的数据到新数组中。
    • Usage:np.copy(order='C')

实战–slice & copy

# coding: utf-8  
  
import numpy as np  
  
x = np.arange(10)  
print('原数组:', x)  
y = x[2:7:2]  
z = x[2:]  
print(y)  
print(z)  
  
x2 = np.arange(1, 13)  
a = x2.reshape(4, 3)  
print(a)  
print('获取第二行')  
print(a[1])  
print('获取第三行第二列')  
print(a[2][1])  
  
# 二维数组切片的使用  
x3 = np.arange(1, 13)  
a = x3.reshape(4, 3)  
print('数组元素')  
print(a)  
# 使用索引获取  
print('所有行的第二列')  
print(a[:, 1])  
print('奇数行的第一列')  
print(a[::2, 0])  
  
a = np.arange(1, 13).reshape(4, 3)  
print('数组元素')  
print(a)  
print('获取第三行第二列的结果:', a[2, 1])  
print('同时获取第三行第二列, 第四行第一列')  
print('分别获取', np.array((a[2, 1], a[3, 0])))  
print('第一个元组是行索引, 第二个元组的列索引', a[(2, 3), (1, 0)])  
  
# 负索引的使用  
x4 = np.arange(1, 13).reshape(4, 3)  
print('数组元素')  
print(x)  
print('获取最后一行')  
print(a[-1])  
print('行进行倒序')  
print(a[::-1])  
print('行列都倒序')  
print(a[::-1, ::-1])  
  
# copy函数实现数组的复制  
a = np.arange(1, 13).reshape(3, 4)  
sub_array = a[:2, :2]  
sub_array[0][0] = 1000 # 它只不过指针指向了原数组的一段内存, 改变sub_array原数组中对应的部分仍然会发生改变  
print(a)  
print(sub_array)  
print('copy')  
sub_array = np.copy(a[:2, :2])  
sub_array[0][0] = 2000  
print(a)  
print(sub_array)

result;

原数组: [0 1 2 3 4 5 6 7 8 9]
[2 4 6]
[2 3 4 5 6 7 8 9]
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
获取第二行
[4 5 6]
获取第三行第二列
8
数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
所有行的第二列
[ 2  5  8 11]
奇数行的第一列
[1 7]
数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
获取第三行第二列的结果: 8
同时获取第三行第二列, 第四行第一列
分别获取 [ 8 10]
第一个元组是行索引, 第二个元组的列索引 [ 8 10]
数组元素
[0 1 2 3 4 5 6 7 8 9]
获取最后一行
[10 11 12]
行进行倒序
[[10 11 12]
 [ 7  8  9]
 [ 4  5  6]
 [ 1  2  3]]
行列都倒序
[[12 11 10]
 [ 9  8  7]
 [ 6  5  4]
 [ 3  2  1]]
[[1000    2    3    4]
 [   5    6    7    8]
 [   9   10   11   12]]
[[1000    2]
 [   5    6]]
copy
[[1000    2    3    4]
 [   5    6    7    8]
 [   9   10   11   12]]
[[2000    2]
 [   5    6]]

进程已结束,退出代码0

你可能感兴趣的:(科学计算与可视化,numpy,python,开发语言)