⛳reshape方法和flatten、ravel方法
- reshape用于改变数组的形状和维度
- flatten 用于将多维数组展平为一维数组。该方法返回一个新的一维数组,其中包含了原始数组中的所有元素,按照原始数组的元素顺序排列。
-
注意
-
reshape
方法返回的是一个新的数组对象,原始数组并没有被修改。 -
flatten
方法返回的是一个新的数组对象,原始数组并没有被修改。 -
ravel
方法将多维数组展平为一维数组,返回的结果是原数组的视图(view),也就是共享内存的方式,因此对返回的结果进行修改会影响原数组。如果需要得到展平后的数组的副本,可以使用flatten
方法。 - 如果需要对原始数组进行就地修改,可以将返回的值重新赋值给原变量
-
-
flatten和ravel的区别
-
ravel
和flatten
都是用于将多维数组展平为一维数组的方法,但它们之间有一些区别:- 返回值类型:
ravel
返回的是原数组的视图(view),如果修改了展平后的数组,原数组也会受到影响;而flatten
返回的是展平后的数组的副本(copy),修改展平后的数组不会影响原数组。 - 内存管理:
ravel
方法返回的是数组的视图,因此不需要额外的内存空间;而flatten
方法返回的是数组的副本,需要分配额外的内存空间。 - 性能:由于
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:文章来源:https://www.toymoban.com/news/detail-579299.html
[ 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')
- Usage:
🎯实战–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;文章来源地址https://www.toymoban.com/news/detail-579299.html
原数组: [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--reshape、切片操作、copy函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!