更改数组的形状
数组的形状由它每个轴上的元素个数给出,形状可以被多种命令修改。
numpy的ravel() 和 flatten()函数
首先声明两者所要实现的功能是一致的(将多维数组降为一维)。
两者的区别在于返回拷贝,还是返回视图,numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响原始矩阵,而numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),会影响原始矩阵。
flattenh函数和ravel函数在降维时默认是行序优先。
import numpy
x = numpy.array([[1, 2], [3, 4]])
x.flatten()[1] = 100
print("flatten后的数组: ", x)
y = numpy.array([[1, 2], [3, 4]])
y.ravel()[1] = 100
print("ravel后的数组: ", y)
flatten后的数组: [[1 2]
[3 4]]
ravel后的数组: [[ 1 100]
[ 3 4]]
转置函数transpose()
import numpy
a = numpy.floor(10*numpy.random.random((3, 4))) # floor(x)取不大于x的最大整数
print("a: ", a)
print("a shape: ", a.shape)
'''
一个数组的形状可以被多种命令修改
'''
b = a.ravel() # 将数组转变成1*n的以为数组
print("ravel变换后的b: ", b)
a.shape = (6, 2) # a.shape = (m, n, ···) 表示将数组a变成n*m*···的数组
print("a的转置: ", a.transpose()) # 转置阵, 变成2*6
a: [[ 5. 9. 3. 0.]
[ 3. 4. 0. 2.]
[ 0. 0. 1. 6.]]
a shape: (3, 4)
ravel变换后的b: [ 5. 9. 3. 0. 3. 4. 0. 2. 0. 0. 1. 6.]
a的转置: [[ 5. 3. 3. 0. 0. 1.]
[ 9. 0. 4. 2. 0. 6.]]
numpy的reshape() 和 resize()函数
reshape函数改变参数形状并返回它,而resize函数改变数组自身。
- reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改;
- resize:无返回值,所谓有返回值,即会对原始多维数组进行修改;
import numpy
x = numpy.array([[1, 2], [3, 4]])
print("未操作下的原数组: ", x)
y = x.reshape(1, 4)
print("reshape后的原数组: ", x)
print("reshape后的返回数组: ", y)
x = numpy.array([[1, 2], [3, 4]])
y = x.resize(1, 4)
print("resize后的原数组: ", x)
print("resize后的返回数组: ", y)
未操作下的原数组: [[1 2]
[3 4]]
reshape后的原数组: [[1 2]
[3 4]]
reshape后的返回数组: [[1 2 3 4]]
resize后的原数组: [[1 2 3 4]]
resize后的返回数组: None
在改变形状操作中一个维度被给做-1,其维度将自动被计算。
import numpy
b = numpy.arange(10).reshape(5, -1)
print(b)
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
更多 shape, reshape, resize, ravel 参考NumPy示例
组合不同的数组
沿不同轴将数组堆叠在一起。
Numpy中stack(),hstack(),vstack()函数
hstack()水平(按列顺序)把数组给堆叠起来,vstack()函数正好和它相反。
import numpy
a = numpy.floor(10*numpy.random.random((2, 2)))
print("原始矩阵a: ", a)
b = numpy.floor(10*numpy.random.random((2, 2)))
print("原始矩阵a: ", b)
vst = numpy.vstack((a, b))
print("vstack后的矩阵: ", vst)
hst = numpy.hstack((a, b))
print("hstack后的矩阵: ", hst)
原始矩阵a: [[ 8. 1.]
[ 3. 5.]]
原始矩阵a: [[ 2. 1.]
[ 4. 5.]]
vstack后的矩阵: [[ 8. 1.]
[ 3. 5.]
[ 2. 1.]
[ 4. 5.]]
hstack后的矩阵: [[ 8. 1. 2. 1.]
[ 3. 5. 4. 5.]]
stack(arrays, axis=0),arrays可以传数组和列表,a = [[1], [2], [3]]是列表。
import numpy
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("列表a: ", a)
# 维度axis受列表a限制
# 以0轴位方向建立
c = numpy.stack(a, axis=0)
print(c)
# 以1轴位方向建立
c = numpy.stack(a, axis=1)
print(c)
列表a: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 4 7]
[2 5 8]
[3 6 9]]
函数column_stack以列将一维数组合成二维数组,它等同与hstack对一维数组。
import numpy
a = numpy.floor(10*numpy.random.random((2, 2)))
print("原始矩阵a: ", a)
b = numpy.floor(10*numpy.random.random((2, 2)))
print("原始矩阵a: ", b)
c = numpy.column_stack((a, b))
print("column_stack后的矩阵: ", c)
a = numpy.array([4, 2])
b = numpy.array([2, 8])
d = a[numpy.newaxis, :] # 插入新维度 或者a[:, numpy.newaxis]
print(d, d.shape)
e = numpy.column_stack((a[:, numpy.newaxis], b[:, numpy.newaxis]))
print(e)
原始矩阵a: [[ 0. 0.]
[ 4. 1.]]
原始矩阵a: [[ 3. 3.]
[ 9. 3.]]
column_stack后的矩阵: [[ 0. 0. 3. 3.]
[ 4. 1. 9. 3.]]
[[4 2]] (1, 2)
[[4 2]
[2 8]]
对那些维度比二维更高的数组,hstack
沿着第二个轴组合,vstack
沿着第一个轴组合,concatenate
允许可选参数给出组合时沿着的轴。
Note
在复杂情况下,r_[]
和c_[]
对创建沿着一个方向组合的数很有用,它们允许范围符号(“:”):
np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()。
np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
>>> r_[1:4,0,4]
array([1, 2, 3, 0, 4])
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.c_[a,b]
print(np.r_[a,b])
print(c)
print(np.c_[c,a])
[1 2 3 4 5 6]
[[1 4]
[2 5]
[3 6]]
[[1 4 1]
[2 5 2]
[3 6 3]]