数据挖掘 numpy之形状操作

更改数组的形状

数组的形状由它每个轴上的元素个数给出,形状可以被多种命令修改。

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]]

猜你喜欢

转载自my.oschina.net/gain/blog/1799411