Numpy多维数组基础及运算详解

640?wx_fmt=jpeg

zarten,互联网一线工作者。

博客地址:zhihu.com/people/zarten

概述

Numpy是python数值计算非常重要的包,其他许多python科学计算的包都是以它为基础,比如:Scipy、Matplotlib、Pandas等,所以Numpy的重要性不言而喻。

Numpy最大的优点之一是提供了高效的大数据数组处理能力,比python内置的list序列更少的内存占用及速度快了很多,因为Numpy是在一个连续的内存块中存储数据以及直接在整个数组上执行复杂计算。

Numpy的多维数组

Numpy最重要的一个特点是可以灵活高效的处理多维数组,并有一个多维数组的对象,即:numpy.ndarray

ndarray对象内的元素必须是相同类型的。

创建多维数组ndarray对象的方法

1.使用array函数创建

第一个参数可以是:可迭代对象、整数、浮点数、其他ndarray对象

 
 

import numpy as np

zarten_1 = np.array([1,2,3])
print('zarten_1:', zarten_1, type(zarten_1))

zarten_2 = np.array(range(10))
print('zarten_2:', zarten_2, type(zarten_2))

zarten_3 = np.array(zarten_2)
print('zarten_3:', zarten_3, type(zarten_3))

zarten_4 = np.array(5)
print('zarten_4:', zarten_4, type(zarten_4))

zarten_5 = np.array(6.8)
print('zarten_5:', zarten_5, type(zarten_5))


640?wx_fmt=jpeg

也可以是嵌套的序列生成的多维度的ndarray对象

import numpy as np

zarten_1 = np.array([[1,2,3], [4,5,6]])
print(zarten_1)


640?wx_fmt=png

2.使用zeros函数创建全0数组

第一个参数可以是:指定一个长度、可迭代对象来指定形状

形状的指定一般是2个数字组成,第一个为行数,第二个为列数,如3行2列就是(3,2)

若是3个数字组成,第一个为最外层的维数,第二个为次外层的维数,第三个为最里面有具体元素的个数。若是4个数字组成,以此类推。

import numpy as np

zarten_1 = np.zeros(5)
print('zarten_1:', zarten_1)

zarten_2 = np.zeros([3,2])
print('zarten_2:')
print(zarten_2)

zarten_3 = np.zeros([2,3,4])
print('zarten_3:')
print(zarten_3)


640?wx_fmt=jpeg

3.使用ones函数创建全1的数组

4.使用empty函数创建没有任何意义的数组

ones和empty用法同zeros相同,这里将不再阐述

5.使用arange函数直接创建连续数字的数组,跟python中的range函数类似

 
 

import numpy as np

zarten_1 = np.arange(10)
print('zarten_1:', zarten_1)


640?wx_fmt=png

6.还可以使用random函数创建一些随机数

random.randn(行, 列)创建具有正态分布的随机数的数组

import numpy as np

zarten_1 = np.random.randn(4,3)
print(zarten_1)


640?wx_fmt=jpeg

random.randint(最小值,最大值,个数)创建随机的整数型数组

import numpy as np

zarten_1 = np.random.randint(2610)
print(zarten_1)


640?wx_fmt=jpeg

一些创建随机数函数如下图所示:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

以上为一部分常用的创建方式,其他方式可以查看numpy官方文档

多维数组对象ndarray的数据类型

1.可通过dtype属性查看数组内元素的数据类型

import numpy as np

zarten_1 = np.arange(10)
print('zarten_1:', zarten_1)
print(zarten_1.dtype)


640?wx_fmt=jpeg

从上图可以看到数据类型为:int32,即有符号整型

其实在创建ndarray对象时,可以指定数据类型,只需将dtype参数设置一下就可以了

import numpy as np

zarten_1 = np.array([1,2,3], dtype= np.float64)
print('zarten_1:', zarten_1)
print(zarten_1.dtype)


640?wx_fmt=jpeg

同时还有一个简写模式,即类型代码,float64简写为:f8 因为占8个字节

这段代码跟上面是等效的

zarten_1 = np.array([1,2,3], dtype= 'f8')

import numpy as np

zarten_1 = np.array([1,2,3], dtype= 'f8')
print('zarten_1:', zarten_1)
print(zarten_1.dtype)

具体的数据类型如下图所示:

640?wx_fmt=jpeg

2.若要改变已经创建好了的数组的数据类型,可以用ndarray对象的astype函数

import numpy as np

zarten_1 = np.array([1,2,3], dtype= 'f8')
print('zarten_1:', zarten_1)
print(zarten_1.dtype)

zarten_2 = zarten_1.astype('u4')
print('zarten_2:', zarten_2)
print(zarten_2.dtype)


640?wx_fmt=jpeg

也可将unicode数字字符类型转为相应的整型或浮点型。必须是纯数字字符,不然会报错

import numpy as np

zarten_1 = np.array(['1','2','3'])
print('zarten_1:', zarten_1)
print(zarten_1.dtype)

zarten_2 = zarten_1.astype('u4')
print('zarten_2:', zarten_2)
print(zarten_2.dtype)


640?wx_fmt=jpeg

由上图可看到“<U1”数据类型

< : 表示字节顺序,小端模式

U : 表示Unicode类型

1 : 表示元素的长度

Numpy多维数组的运算

简单的运算

ndarray对象的运算效率极高,不用编写循环,运算直接应用在元素级上。

import numpy as np

zarten_1 = np.array([[1,2,3], [4,5,6]])

zarten_2 = zarten_1 * 2
print(zarten_2)


640?wx_fmt=jpeg

上图可看到,每个元素都乘以2

ndarray对象之间的运算,也是运用在元素级

import numpy as np

zarten_1 = np.array([[1,2,3], [4,5,6]])

zarten_2 = np.array([7,8,9])
print(zarten_1 + zarten_2)


640?wx_fmt=jpeg

多维数组之间比较,会产生一个布尔类型的数组

import numpy as np

zarten_1 = np.array([[1,2,3], [24,25,26]])

zarten_2 = np.array([7,8,9])
print(zarten_1 > zarten_2)


640?wx_fmt=jpeg

一元运算

import numpy as np

zarten = np.array([1,2,3,4,5])
print(np.sqrt(zarten))
print(np.sin(zarten))


640?wx_fmt=png

常见一元运算函数如下所示:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

二元运算

import numpy as np

zarten_1 = np.array([1,2,3,4,88])
zarten_2 = np.array([6,7,8,9,10])
print(np.maximum(zarten_1, zarten_2))
print(np.add(1,2))


640?wx_fmt=jpeg

常用的二元运算函数如下图

640?wx_fmt=jpeg

三元运算

有时候np.where(cond,one,two) 函数可以很方便处理数组,参数:cond为条件,若数组元素级满足条件就置换为one,否则two

import numpy as np

zarten_1 = np.array([-1,-2,-3,4,88])

zarten = np.where(zarten_1 <0, 0, 999)
print(zarten)


640?wx_fmt=jpeg

集合运算

numpy中提供一些针对一维的集合运算,如unique函数、in1d函数等

unique函数,跟python中的set集合类似,但unique函数的输出结果是排好序的

import numpy as np

zarten_1 = np.array([5,3,6,5,4,2,1,2])
print(zarten_1)
print('*' * 50)

print(np.unique(zarten_1))


640?wx_fmt=jpeg

in1d()函数返回一个布尔型数组,用于判断一个数组的元素是否有在另一个数组内

import numpy as np

zarten_1 = np.array([5,3,6,5,4,2,1,2])
print(zarten_1)
print('*' * 50)

print(np.in1d(zarten_1, [5,3]))


640?wx_fmt=jpeg

其他集合运算如下图所示:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

▼ 点击成为社区注册会员          「在看」一下,一起PY!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值