看我72变,numpy数组的变形方法

原文链接:http://www.juzicode.com/data-numpy-change-shape

相关链接:NumPy数组的属性和常用创建方法

numpy数组的变形可以实现对原始数组的维度改变、轴长度改变,假设原始数据的形状为(n1,n2….nx),变化后的形状为(m1,m2,…my),则要求 n1*n2….*nx = m1*m2…*my。

1、a.resize(m,n)

b=a.resize(m,n):会改变数组a本身,返回b是None。

#juzicode.com,VX:桔子code
import numpy as np
a = np.arange(1,7)
print('a=',a)
b=a.resize(2,3)
print('b=',b)
print('a=',a)

=====运行结果:
a= [1 2 3 4 5 6]
b= None
a= [[1 2 3]
 [4 5 6]]

2、a.reshape(m,n)

b=a.reshape(m,n):不会改变a,会返回一个变化后的数组b,b是a的一个视图,修改b会影响a。

#juzicode.com,VX:桔子code
import numpy as np
a = np.arange(1,7)
print('a=',a)
b=a.reshape(2,3)
print('b=',b)
print('a=',a)
b[0][0] = 99 #b是a的视图
print('b=',b)
print('a=',a)

=====运行结果:
a= [1 2 3 4 5 6]
b= [[1 2 3]
 [4 5 6]]
a= [1 2 3 4 5 6]
b= [[99  2  3]
 [ 4  5  6]]
a= [99  2  3  4  5  6]

3、a.shape=(m,n)

a.shape=(m,n):功能和a.resize()一样,形状参数不限于2维。

#juzicode.com,VX:桔子code
import numpy as np
a = np.arange(1,7)
print('a=',a)
a.shape = (2,3)
print('a=',a)

=====运行结果:
a= [1 2 3 4 5 6]
a= [[1 2 3]
 [4 5 6]]

4、a.ravel()

b=a.ravel(): 返回一个一维数组b,返回数组的视图,如果修改b,会导致a发生变化。

#juzicode.com,VX:桔子code
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('a=',a)
b = a.ravel()
print('b=',b)
print('a=',a)
b [0] = 99 #b是a的视图,修改b的元素会同时改变a
print('b=',b)
print('a=',a)

=====运行结果:
a= [[1 2 3]
 [4 5 6]]
b= [1 2 3 4 5 6]
a= [[1 2 3]
 [4 5 6]]
b= [99  2  3  4  5  6] #b是a的视图,修改b的元素会同时改变a
a= [[99  2  3]
 [ 4  5  6]]

5、a.flatten()

b=a.flatten():返回一个一维数组b,b是一个新的数组,修改b不会影响a。

#juzicode.com,VX:桔子code
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('a=',a)
b = a.flatten()
print('b=',b)
print('a=',a)
b [0] = 99
print('b=',b)
print('a=',a)

=====运行结果:
a= [[1 2 3]
 [4 5 6]]
b= [1 2 3 4 5 6]
a= [[1 2 3]
 [4 5 6]]
b= [99  2  3  4  5  6]
a= [[1 2 3]
 [4 5 6]]

6、a.transpose()

b=a.transpose():返回一个转置数组b,a不会发生变化,返回的是a的一个视图,修改b的元素会改变a。对于二维数组,行变成列,列变成行。

#juzicode.com,VX:桔子code
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('a=',a)
b = a.transpose()
print('b=',b)
print('a=',a)
b [0][0] = 99
print('b=',b)
print('a=',a)

=====运行结果:
a= [[1 2 3]
 [4 5 6]]
b= [[1 4]
 [2 5]
 [3 6]]
a= [[1 2 3]
 [4 5 6]]
b= [[99  4]
 [ 2  5]
 [ 3  6]]
a= [[99  2  3]
 [ 4  5  6]]

7、a.T

b=a.T:功能同a.transpose(),返回一个转置数组b,a不会发生变化,返回的是a的一个视图,修改b的元素会改变a。对于二位数组,行变成列,列变成行。

#juzicode.com,VX:桔子code
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('a=',a)
b = a.T
print('b=',b)
print('a=',a)
b [0][0] = 99
print('b=',b)
print('a=',a)

=====运行结果:
a= [[1 2 3]
 [4 5 6]]
b= [[1 4]
 [2 5]
 [3 6]]
a= [[1 2 3]
 [4 5 6]]
b= [[99  4]
 [ 2  5]
 [ 3  6]]
a= [[99  2  3]
 [ 4  5  6]]

小结:数组的变形方法有些只是生成原始数组的新视图,并没有真正改变数组的形状,比如reshape、ravel、transpose等,而resize方法、修改数组shape属性则会修改数组本身的形状,flatten则会生成一个新的一维数组。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注