numpy矩阵操作

目录

  • 连接矩阵或列表
    • np.concatenate()
    • np.vstack() 垂直连接
    • np.hstack() 水平连接
    • np.dstack() 深度连接
    • np.stack()
    • np.newaxis 新增加一个维度
    • np.append()
  • 矩阵的复制
    • np.tile()
    • np.repeat()
    • np.ones_like(x)
  • 矩阵的计算
    • 求矩阵的逆
    • 求矩阵的范数(也可以求两点之间的距离)
    • np.meshgrid() 生成网格
    • 交换矩阵的两个维度
    • 矩阵拉伸前后的坐标转换
    • np.clip
    • 数组的交集

连接矩阵或列表

np.concatenate()

np.concatenate((im_mask_gt, im_mask_pre), axis = 0)
np.concatenate([points_world, np.ones((points_world.shape[0], 1))], axis=-1)

np.vstack() 垂直连接

>>> a=[[1],[2],[3]]
>>> b=[[1],[2],[3]]
>>> c=[[1],[2],[3]]
>>> d=[[1],[2],[3]]
>>> np.vstack((a,b,c,d)) 
 [[1]
 [2]
 [3]
 [1]
 [2]
 [3]
 [1]
 [2]
 [3]
 [1]
 [2]
 [3]]

np.hstack() 水平连接

>>> a=[[1],[2],[3]]
>>> b=[[1],[2],[3]]
>>> c=[[1],[2],[3]]
>>> d=[[1],[2],[3]]
>>> np.hstack((a,b,c,d))
[[1 1 1 1]
 [2 2 2 2]
 [3 3 3 3]]

np.dstack() 深度连接

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print np.dstack((a, b))

[[[1 5]
  [2 6]]
 [[3 7]
  [4 8]]]

np.stack()

连接一个列表中的多个列表

>>> a=[[1,2,3,4],
      [5,6,7,8],
      [9,10,11,12]]
>>> c=np.stack(a,axis=0)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> c=np.stack(a,axis=1)
 [[ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]]

连接多个列表

>>> a=[1,2,3,4]
>>> b=[5,6,7,8]
>>> c=[9,10,11,12]
>>> np.stack((a,b,c),axis=0)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> np.stack((a,b,c),axis=1)
[[ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]]
#沿着第一维连接4个向量,得到的numpy维度为(n,3)

np.newaxis 新增加一个维度

a=np.array([0,3,4,2,6,4])
a.shape #(6,)
b = a[:,np.newaxis]
#b=array([[0],
         [3],
         [4],
         [2],
         [6],
         [4]])
#b.shape = (6, 1)

np.append()

import numpy as np
a=[1,2,3]
b=[4,5]
c=[[6,7],[8,9]]
d=[[10,11],[12,13]]
print('在一维数组a后添加values,结果如下:{}'.format(np.append(a,b,axis=0)))
print('沿二维数组c的行方向添加values结果如下:'.format(np.append(c,d,axis=0)))
print('沿二维数组c的列方向添加values结果如下:'.format(np.append(c,d,axis=1)))
在一维数组a后添加values,结果如下:
[1 2 3 4 5]
沿二维数组c的行方向添加values结果如下:
[[ 6  7]
 [ 8  9]
 [10 11]
 [12 13]]
沿二维数组c的列方向添加values结果如下:
[[ 6  7 10 11]
 [ 8  9 12 13]]

矩阵的复制

np.tile()

>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2) #沿X轴复制2倍
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
>>> np.tile(b, (2, 1))#沿X轴复制1倍(相当于没有复制),再沿Y轴复制2倍
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])

np.repeat()

对矩阵array进行复制,在维度axis上复制repeats次

np.repeat(array,repeats,axis=1)

np.ones_like(x)

ones_like返回一个用1填充的跟输入数组 形状和类型一样的数组
zeros_like返回一个用0填充的跟输入数组 形状和类型一样的数组

>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.ones_like(x)
array([[1, 1, 1],
       [1, 1, 1]])
>>>
>>> y = np.arange(3, dtype=np.float)
>>> y
array([ 0.,  1.,  2.])
>>> np.ones_like(y)
array([ 1.,  1.,  1.])

矩阵的计算

求矩阵的逆

A = np.mat("0 1 2;1 0 3;4 -3 8")
print (A)
#[[ 0 1 2]
# [ 1 0 3]
# [ 4 -3 8]]
inv = np.linalg.inv(A)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]

求矩阵的范数(也可以求两点之间的距离)

a=np.array([0,3,4,2,6,4]);
b = a.reshape((2, 3))
print(np.linalg.norm(b,axis=1,keepdims=True))
#[[5.        ]
 [7.48331477]]

bb=np.array([3,4])
np.linalg.norm(bb)
#5.0

np.meshgrid() 生成网格

x = np.array([0, 1, 2])
y = np.array([0, 1])

X, Y = np.meshgrid(x, y) #生成2行3列的矩阵坐标
print(X)
print(Y)

[[0 1 2]
 [0 1 2]]
[[0 0 0]
 [1 1 1]]

交换矩阵的两个维度

np.swapaxes(data,axis1,axis2) # (交换axis1和axis2)

矩阵拉伸前后的坐标转换

#Consider a (6,7,8) shape array, what is the index (x,y,z) of the 101th element ?(所有下标从0开始)
>>> print np.unravel_index(100,(6,7,8))
(1, 5, 4)

np.clip

该函数的作用是将数组a中的所有数限定到范围a_min和a_max中。
部分参数解释:
a:输入矩阵;
a_min:被限定的最小值,所有比a_min小的数都会强制变为a_min;
a_max:被限定的最大值,所有比a_max大的数都会强制变为a_max;
out:可以指定输出矩阵的对象,shape与a相同

np.clip(a, a_min, a_max, out=None)

数组的交集

np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
array([1, 3])

from functools import reduce
>>> reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
array([3])

你可能感兴趣的:(numpy,矩阵,python)