1.np.flatten() 和 np.ravel()
两者的功能是一致的,将多维数组降为一维,但是两者的区别是返回拷贝还是返回视图。
np.flatten()返回一份拷贝,对拷贝所做修改不会影响原始矩阵,而np.ravel()返回的是视图,修改时会影响原始矩阵
使用时推荐np.flatten()
输入:import numpy as np
a = np.array([[1 , 2] , [3 , 4]])
b = a.flatten()
print('b:' , b)
c = a.ravel()
print('c:' , c)
d = a.ravel('F')
print('d:' , d)# 二者的区别
b[0] = 10
print('a:' , a)
c[0] = 10
print('a:' , a)输出:b: [1 2 3 4]
c: [1 2 3 4]
d: [1 3 2 4]
a: [[1 2]
[3 4]]
a: [[10 2]
[ 3 4]]
2.np.array()与np.asarray的区别
其在于输入为数组时,np.array是将重新创建一个数组空间并将数据复制进去,它有自己的一块内存区域,所以随着输入的改变np.array的输出不变(即返回拷贝);而np.asarray功能是将指向数组a的计数器加1,并指向该数组,这样当原始数组改变的时候,np.asarray的输出也会改变(相当于返回视图)。
推荐使用np.array()
输入:import numpy as npa=np.ones((3,3))
b=np.array(a)
c=np.asarray(a)
a[1]=2print('a:\n',a)
print('b:\n',b)
print('c:\n',c)
print(b is a) # False
print(c is a) # True输出:a:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]]
b:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]]
c:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]]
False
True
但是其实如果是这么写的话,两者又是等价的:(因为改变了类型,所以都只能返回一个拷贝)
输入:a=np.ones((3,3))
b=np.array(a,dtype = 'float32')
c=np.asarray(a,dtype = 'float32')
a[1]=2print('a:\n',a)
print('b:\n',b)
print('c:\n',c)
print(b is a) # False
print(c is a) # True输出:a:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]]
b:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]]
c:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]]
False
False