numpy处理数据时一些常用函数

np.loadtxt

我们以iris.data.举例,下面是iris数据集(取前6行),其中前4列是特征,第5列是类别,有三类,分别是Iris-setosa,Iris-versicolor和Iris-virginica

iris.data
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa

下面给出加载这个数据集的代码,再对其中的参数进行解释

path = 'iris.data'
np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

参数:
path:要加载的数据文件路径
dtype:数据类型,如果不写python默认为双精度浮点数
delimiter:加载文件中的分隔符

重点说一下converters,可以看到文件中类别那一列是字符串,但其实我们想要的肯定是数字,所以converters的作用其实就是把某一列的数据类型进行改变,iris_type是自定义的函数:

def iris_type(s):
    it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
    return it[s]

并且如果不用converters直接读入需要重新设置dtype:效果如下:

data = np.loadtxt(path, dtype={
               'names': (
                   'sepal length', 'sepal width', 'petal length',
                   'petal width', 'label'),
               'formats': (
                   float, float, float, float, '|S15')}, delimiter=',')

输出结果:
[(5.1, 3.5, 1.4, 0.2, b'Iris-setosa') (4.9, 3. , 1.4, 0.2, b'Iris-setosa')
 (4.7, 3.2, 1.3, 0.2, b'Iris-setosa') (4.6, 3.1, 1.5, 0.2, b'Iris-setosa')
 (5. , 3.6, 1.4, 0.2, b'Iris-setosa') (5.4, 3.9, 1.7, 0.4, b'Iris-setosa')
 (4.6, 3.4, 1.4, 0.3, b'Iris-setosa') (5. , 3.4, 1.5, 0.2, b'Iris-setosa')
 (4.4, 2.9, 1.4, 0.2, b'Iris-setosa') (4.9, 3.1, 1.5, 0.1, b'Iris-setosa')
 (5.4, 3.7, 1.5, 0.2, b'Iris-setosa') (4.8, 3.4, 1.6, 0.2, b'Iris-setosa')……

可以看到字符串前有个b,这是因为np.loadtxt和np.genfromtxt在字节模式下运行,这是Python2中的默认字符串类型。但是Python3使用unicode,并用b标记字节字符串。如果一定要用这种方式,就需要单独取出那一列然后在后面加上np.loadtxt(…).astype(str)
此外若是需要做可视化,就只需要二维的数据,那么只需要其中第0,1,4列的数据,代码如下:

np.loadtxt(path, dtype=float, delimiter=',', usecols=(0, 1, 4), converters={4: iris_type})

输出结果:
[[5.1 3.5 0. ]
 [4.9 3.  0. ]
 [4.7 3.2 0. ]
 [4.6 3.1 0. ]
 [5.  3.6 0. ]
 [5.4 3.9 0. ]

若是需要跳过前n行,就需要设置skiprows=n

data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type}, skiprows=1)

输出结果:
[[4.9 3.  1.4 0.2 0. ]
 [4.7 3.2 1.3 0.2 0. ]
 [4.6 3.1 1.5 0.2 0. ]
 [5.  3.6 1.4 0.2 0. ]
 [5.4 3.9 1.7 0.4 0. ]
 [4.6 3.4 1.4 0.3 0. ]

不常用参数:
comment='#', 若某一行开头为#,就跳过该行

np.zeros, np.ones, np.full

这三个函数功能几乎相同,接下来一一介绍
np.zeros

np.zeros(shape,  dtype=float, order='C')
功能:
创建一个形状为shape的全为0的数组

参数:
shape:数据形状,(2,4)代表2行4列
dtype:数据类型,默认为float
order:可选参数‘C’和‘F’,代表数据存储方式

np.ones

np.ones(shape,  dtype=float, order='C')
功能:
创建一个形状为shape的全为1的数组,其他和zeros一样

np.full

np.full(shape, fill_value, dtype=None, order='C')
功能:
创建一个形状为shape的值为fill_value的数组

参数:
fill_value:填充到数组中的值,若fill_value填0和1其实功能和就和zeros和ones一样,它更加适用于各种情况

np.empty

np.empty语法如下:

np.empty(shape[, dtype, order]) 
功能:
创建一个给定形状的空数组

参数:和np.zeros一样

这个函数看似和np.zeros差不多,但还是有需要注意的地方,下面看例子

np.empty(shape=5)
输出:
array([1.12152902e-321, 3.37112413e-316, 3.37112413e-316, 2.12199579e-314,
       4.78421354e-317])
可以看到,它并不是一个空的数组,它返回的一个随机元素的矩阵

如果不确定具体需要多少行或多少列,下面以不清楚行举例
就可以创建
np.empty(shape=[0, 19])
然后再使用np.append一行一行的往里面加入数据

下面将介绍np.append

np.append

np.append(arr, values, axis=None)
功能:
向arr里加入values

参数:
arr:需要被添加的数组
values:向数组里添加的值
axis:如果不指定axis,将会把arr铺平为一维数组,然后向里面添加value,若指定axis,需要values和arr有相
同的行数或列数,如果axis=0,添加一行,如果axis=1,添加一列

numpy切片

因为要处理的数据大多为二维数组,所以讲一下切片具体以及简便一点的写法,以下代码以iris为例

切片标准格式:
data[:,:]
逗号表示分隔,可以看成逗号前是行,逗号后是列

data[0:1,:]
意思:取第0行所有列
输出:
[[5.1 3.5 1.4 0.2 0. ]]

data[:,0:1]
意思:取第0列所有列=行
输出:
[[5.1]
 [4.9]
 [4.7]
 [4.6]
 [5. ]
 [5.4]
 [4.6]...

data[:,:2]
意思:取data前两列所有行,0在其中可以省略

data[...,:2]
...:省略号也可以代表从头取到尾,和上面意思一样

np.c_, np.r_

np.c_[a,b]
功能:将a和b按列的方式组合在一起

例子:
np.c_[[1,2,3],[4,5,6]]
输出:
array([[1, 4],
       [2, 5],
       [3, 6]])
np.r_[a,b]
功能:将a和b按行的方式组合在一起

例子:
np.r_[[[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]]]
输出:
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])

值得注意的是下面这个例子:
np.r_[[1,2,3],[4,5,6]]
输出:
array([1, 2, 3, 4, 5, 6])
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值