python:numpy中np.newaxis,np.tile,np.repeat等常见函数的用法

在对数据进行处理时候,常见以下函数
np.newaxis(), np.ndim(), np.tile(), np.repeat(), np.view(), np.astype(), np.dtype(),

(1)np.newaxis() ------作用:增加维数

例子如下:

>>> import numpy as np
>>> x = np.array([1,2,3,4])
>>> y = x[np.newaxis ,:,np.newaxis]
>>> z = x[np.newaxis ,:]
>>> print(x.shape, y.shape, z.shape)
(4,) (1, 4, 1) (1, 4)
>>> x
array([1, 2, 3, 4])
>>> y
array([[[1],
        [2],
        [3],
        [4]]])
>>> z
array([[1, 2, 3, 4]])

可以对已有数据通过np.newaxis函数对位置进行升维

(2)np.ndim-----作用:输出数组维数
>>> x.ndim
1
>>> y.ndim
3
>>> z.ndim
2

输出是一个标量且只有一个数字

(3)np.tile(A, reps)-----作用:复制数组元素

输入: A是数组,reps是个list,reps的元素表示对A的各个axis进行重复的次数
返回: 一个数组,维度的数量等于max(A.ndim,len(reps)),注意不要混淆A.ndim和A.shape
有两种特殊情况:
1、A.ndim < len(reps), 此时需要调整A的维度使得A.ndim = len(reps),即添加长度为1的维度,注意:新的维度在原维度的前面,比如原来的A.shape是(3,5),调整后是(1,3,5)
2、A.ndim > len(reps), 此时需要增加list的长度,使得A.ndim = len(reps),即在reps的最前面增加元素1,比如原来的list是[2,2],增加长度后是[1,2,2]
例子如下:

# 示例1,正常情况
a = np.array([0, 1, 2])
# 将axis=0重复2次
np.tile(A=a, reps=2)
# array([0, 1, 2, 0, 1, 2])

# 示例2,特殊情况1:A.ndim < len(reps)
a = np.array([0, 1, 2])
# 将a.shape调整至(1,3),然后将axis=0重复2次,将axis=1重复2次
np.tile(A=a, reps=(2, 2))
#array([[0, 1, 2, 0, 1, 2], [0, 1, 2, 0, 1, 2]])

# 示例3,特殊情况1:A.ndim < len(reps)
a = np.array([0, 1, 2])
# 将a.shape调整至(1,1,3),然后将axis=0重复2次,将axis=1重复1次,将axis=2重复2次
np.tile(A=a, reps=(2, 1, 2))
#array([[[0, 1, 2, 0, 1, 2]], [[0, 1, 2, 0, 1, 2]]])

# 示例4,特殊情况2:A.ndim > len(reps)
b = np.array([[1, 2], [3, 4]])
# 将reps=[2]调整至[1,2],然后将axis=0重复1次,将axis=1重复2次
np.tile(A=b, reps=2)
#array([[1, 2, 1, 2], [3, 4, 3, 4]])

# 示例5,正常情况
b = np.array([[1, 2], [3, 4]])
# 将axis=0重复两次,将axis=1重复1次
np.tile(A=b, reps=(2, 1))
#array([[1, 2], [3, 4], [1, 2], [3, 4]])

# 示例6,特殊情况1:A.ndim < len(reps)
c = np.array([1,2,3,4])
# 将c.shape调整至(4,1),然后将axis=0重复4次,将axis=1重复1次
np.tile(A=c, reps=(4,1))
# array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]])

(4)np.repeat(a, reps,axis = None)-----作用:复制数组元素

输入: a是数组,reps是各个元素重复的次数(reps一般是个标量,稍复杂点是个list),在axis的方向上进行重复
返回: 如果不指定axis,则将重复后的结果展平(维度为1)后返回;如果指定axis,则不展平
例子如下:

# 示例1,展平
# 将3重复4次
np.repeat(a=3, repeats=4)
# array([3, 3, 3, 3])

# 示例2,展平
# 每个元素都重复2次,并展平后输出
x = np.array([[1,2],[3,4]])
np.repeat(a=x, repeats=2)
# array([1, 1, 2, 2, 3, 3, 4, 4])

#示例3,不展平
x = np.array([[1,2],[3,4]])
# 沿着axis=1方向重复,将axis=1方向上的每个元素重复3次
np.repeat(a=x, repeats=3, axis=1)
#array([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]])

#示例3,不展平
x = np.array([[1,2],[3,4]])
# 沿着axis=0方向重复,将axis=0方向上的第0个元素重复1次,第1个元素重复2次
np.repeat(a=x, repeats=[1, 2], axis=0)
# array([[1, 2], [3, 4], [3, 4]])

(5)torch.view()-----作用:改变tensor的尺寸

这里插入一个tensor类型数组,也是常常用在数据处理
例子如下:

>>> import torch
>>> x = torch.tensor([[1,2,3,4],[5,6,7,8]])
>>> x.shape
torch.Size([2, 4])
>>> y = x.view(4,2)
>>> y
tensor([[1, 2],
        [3, 4],
        [5, 6],
        [7, 8]])
>>> z = x.view(1,-1)
>>> z
tensor([[1, 2, 3, 4, 5, 6, 7, 8]])

当出现-1时,则是通过前一个维度自动算出该维度

(6)np.astype(), np.dtype-----作用:改变数据类型, 显示数据类型

astype:转换数组的数据类型。

int32 --> float64 完全莫得问题

float64 --> int32 会将小数部分截断

string_ --> float64 如果字符串数组表示的全是数字,也可以用astype转化为数值类型
例子如下:

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4]])
>>> x1 = x.astype(float)
>>> print(x.dtype, y.dtype,x1.dtype)
int32 int32 float64
>>> z = np.array([1.2,2.3])
>>> z1 = z.astype(int)
>>> print(z.dtype,z1.dtype)
float64 int32

float 是python中的数据类型,numpy会自动将float转换为其中对应的float64类型,int同样如此

发布了11 篇原创文章 · 获赞 6 · 访问量 608

猜你喜欢

转载自blog.csdn.net/qq_35896136/article/details/104377913