Numpy常见方法(1)-创建numpy对象和numpy基本属性、numpy的切片及常见错误和numpy常见通用函数

说明:本blog基于python3版本, numpy 1.19.5


前言

我们在Numpy常见方法(0)中详细介绍了numpy在做大量数据运算处理的优势及底层原理,本文主要是介绍如何把numpy应用到实际工作中,包括三个方面:创建numpy对象和numpy基本属性、numpy的切片和numpy常见通用方法。
在这之前我首先介绍一个贯穿numpy应用的概念:ndarray;ndarray是python的一个大型,快速的数据集容器,所有ndarray类型的数据都存放在该容器中;该容器中的所有ndarray对象都有两个基本属性:shape 和 dtype。

一、创建numpy对象和numpy基本属性

numpy对象的创建主要是通过 numpy.array() 方法,该方法的作用对象是序列型数据,包括列表list,元组tuple,数组range, 和其他序列型数据。我们应用numpy.array() 方法时只需记住公式: numpy.array(序列型数据)

首先,我们用代码演示一下如何生成numpy对象

import numpy as np
a_list = [1,2,3]
b_tuple = (1,2,3)
c_range = range(3)

a = np.array(a_list)
b = np.array(b_tuple)
c = np.array(c_range)

print(a)
print(b)
print(c)

结果如下,

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

OK,我们接下来介绍一下每个ndarray类型的数据都具有的两个基本属性,shape和dtype
shape 返回的是ndarray类型数据的“形状”, 学过线性代数的同学都知道,一个高维数据都是有“形状的”, 比如 N * M, 代表一个数据由N行M列组成,是一个二维数据;那么我们演示一下如何使用shape方法获得数据的维度;
假设我们现在创建一个3维数据

import numpy as np
a = np.array([[[1,2,3,3],[1,2,3,3],[1,2,3,3]], [[6,7,8,8],[6,7,8,8],[6,7,8,8]]])
b = a.shape
print(b)

结果如下,

(2, 3, 4)

也就是说我们目前设置的a是一个 2 * 3 * 4的三维ndarray;有同学可能困惑如何计算a的维度,其实很简单,记住一个原则:从外往里扒括号
本题中最外层是两个并列元素,[[1,2,3,3],[1,2,3,3],[1,2,3,3]] 和 [[6,7,8,8],[6,7,8,8],[6,7,8,8]];第二层是三个并列元素, [1,2,3,3],[1,2,3,3],[1,2,3,3] 或者 [6,7,8,8],[6,7,8,8],[6,7,8,8];最内层是4个并列元素,[1,2,3,3] 或 [1,2,3,3]或[1,2,3,3] 或 [6,7,8,8]或 [6,7,8,8]或 [6,7,8,8];如果想有一个整体概念,可以把每个维度分别对应长宽高,那么这里的变量a 就是一个十足的长方体!是不是对高维矩阵有了更深的认识?!

另外一个基础属性是dtype, 这个属性可以帮助我们更改或确定ndarray类型数据内部元素的基本属性,比如,如果我们在创建ndarray数据时想让ndarray中的元素为 双精度浮点数,那么我们在np.array()方法中加入dtype属性名,并设置为 dtype = numpy.float64;
【注:有的元素不能成功转化为我们想要的数据类型,比如我们把string类型的数据转化为双精度浮点数类型(numpy.float)的数据时,就会报ValueError!!!】
我们用代码演示一下dtype属性以及如何更改ndarray类型中元素的数据类型
常用astype方法

import numpy as np
###我们首先把a中的元素数据类型设置为双精度浮点数
a = np.array([1,2,3], dtype = np.float64)
b = a.dtype
print("a 中元素数据类型为 " + str(b))
###然后我们把a中的元素数据类型更改为整数
a = a.astype(np.int32)
b = a.dtype
print("更改数据类型后, a 中元素数据类型为 " + str(b))

结果如下,

a 中元素数据类型为 float64
更改数据类型后, a 中元素数据类型为 int32

nice!
【注:我们更改为元素数据类型一定要重新赋值给原ndarray!!!否则,元素数据类型更改失败】

二、numpy的切片及常见错误

有的时候,我们需要对一个ndarray进行切片,以获得一个满足某种条件的更小的ndarray类型的数据。这里主要介绍布尔值索引法和直接切片两种方法。
首先介绍直接切片法,公式 ndarray[对第一个维度操作,对第二个维度操作,对第三个维度操作 。。。]

比如我有一个二维数组,我只取前2行(第一个维度)和后4列(第二个维度),
【说明:ndarray类型数据如果是二维的,那么默认行为第一个维度,列为第二个维度,约定俗称,没有为什么】
【技巧:ndarray直接切片与list类型数据切片很相似!!!通过下边实例体会一下】

代码如下

import numpy as np
a = np.array([[1,2,3,4,5],[1,2,3,4,4], [1,4,5,6,7],[1,4,5,6,0]])
print(a)
###我只取前2行(第一个维度)和后4列(第二个维度)
b = a[:2,1:]
print(b)

结果如下

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

OK, meet our respectation!
由此可见, 直接切片法是通过元素位置进行切片

接下来, 我们介绍第二种布尔值索引切片法公式:新ndarray = ndarray[条件]

我们设定新的ndarray, a, 然后挑选出所有小于0的元素形成新的ndarray

import numpy as np
a = np.array([[1,2,-3],[-19,99,7],[90,-8,0]])
print(a)
b = a[a<0]
print(b)

结果如下

[[  1   2  -3]
 [-19  99   7]
 [ 90  -8   0]]
 [ -3 -19  -8]

我们同样可以使用ndarray的布尔值切片法对满足某些条件的元素进行更改等操作;公式: ndarray[条件] = 目标值

比如,我们设定新的ndarray, a, 然后更改所有小于0的元素为-100

import numpy as np
a = np.array([[1,2,-3],[-19,99,7],[90,-8,0]])
print(a)
a[a<0] = -100
print(a)

结果如下

[[  1   2  -3]
 [-19  99   7]
 [ 90  -8   0]]
[[   1    2 -100]
 [-100   99    7]
 [  90 -100    0]]

你get了吗~

这里我给大家介绍一下使用numpy直接切片方法时的常见错误
比如,我设置一个二维ndarray,使用直接切片法获得一个新的ndarray,我们称为b
代码如下

import numpy as np
a = np.array([[0,2,3], [4,5,6]])
print(a)
b = a[:,:2]
print(b)
[[0 2 3]
 [4 5 6]]
[[0 2]
 [4 5]]

然后,我们改变b的第(0,0)位的元素为1,

b[0,0] = 1
print(b)

结果如下,

[[1 2]
 [4 5]]

我们发现,b的(0,0)位的确由0更改为1
但当我们打印一下a时,我们会惊异的发现,

print(a)

结果如下,

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

a的原来为0的元素居然也变为了1!这是为什么?因为numpy的直接切片方法是对原有ndarray做了“视图”,而不是copy, 所以如果后续更改“视图”的元素,原ndarray也会随之改变!

那我们回过头再看一下布尔值切片法,就不会出现上述问题!!!
代码如下,

import numpy as np
a = np.array([[1,2,-3],[-19,99,7],[90,-8,0]])
b = a[a<0] 
print(b)
print(a)
b[0] = -99
print(b)
print(a)

结果如下,

[ -3 -19  -8]
[[  1   2  -3]
 [-19  99   7]
 [ 90  -8   0]]
[-99 -19  -8]
[[  1   2  -3]
 [-19  99   7]
 [ 90  -8   0]]

a矩阵先后一致!

这说明numpy的布尔值切片法得到了原ndarray数据的copy,而不是“视图”,后续对copy中的元素做改变,不会影响原ndarray元素的值!!!

三、numpy常见通用函数

numpy通用函数,又称为 ufunc, 是一种对ndarray类型数据进行逐元素操作的函数。通用函数根据作用对象的个数分为一元通用函数,二元通用函数和多元通用函数

一元通用函数包括:abs(绝对值),sqrt(平方根),square(平方),exp(求自然指数),log(以自然数e为底的对数值),sign(元素的符号),ceil(向上取整),floor(向下取整),cos(余弦),sin(正弦),tan(正切),cosh(双曲余弦),sinh(双曲正弦),tanh(双曲正切),arcsin/arccos/arctan/arcsinh/arccosh/arctanh(反三角)

首先我们演示一元通用函数:
代码:

import numpy as np
a = np.array([1,2,3])
print(a)
b = np.square(a)
print(b)

结果如下

[1 2 3]
[1 4 9]

二元通用函数,作用对象是两个ndarray,比如 add(对应位置元素相加),subtract(在第二个数据中,将第一个数据包含的元素去掉),multiply(对应位置元素相乘),power(将第二个数组作为第一个数组的幂次方),maximum(对应位置元素取最大值),fmax(在忽略Nan的情况下,对应位置元素取最大值),minimum(对应位置元素取最小值),fmax(在忽略Nan的情况下,对应位置元素取最小值)

我们演示一下二元通用函数的使用
假设两个ndarray分别为 a = np.array([1,2,202]) b = np.array([100,102,101])
代码如下

 a = np.array([1,2,202,80])
 b = np.array([100,102,101,10])
 c = np.maximum(a,b)
 print(c)

结果如下

[100 102 202  80]

漂亮!


总结

写在最后,希望本blog对你的numpy应用有所帮助,欢迎点赞收藏~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Efred.D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值