reshape
方法返回的是一个新的数组对象,原始数组并没有被修改。flatten
方法返回的是一个新的数组对象,原始数组并没有被修改。ravel
方法将多维数组展平为一维数组,返回的结果是原数组的视图(view),也就是共享内存的方式,因此对返回的结果进行修改会影响原数组。如果需要得到展平后的数组的副本,可以使用flatten
方法。ravel
和flatten
都是用于将多维数组展平为一维数组的方法,但它们之间有一些区别:
ravel
返回的是原数组的视图(view),如果修改了展平后的数组,原数组也会受到影响;而flatten
返回的是展平后的数组的副本(copy),修改展平后的数组不会影响原数组。ravel
方法返回的是数组的视图,因此不需要额外的内存空间;而flatten
方法返回的是数组的副本,需要分配额外的内存空间。ravel
返回的是数组的视图,因此执行速度较快;而flatten
返回的是副本,因此执行速度较慢。总的来说,如果你只需要展平数组,并且不需要修改原数组,那么可以使用
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
copy
方法创建数组的副本。copy
方法用于创建原数组的一个深拷贝,即创建一个新的数组,并复制原数组的数据到新数组中。
np.copy(order='C')
# 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