你必须掌握的 Python 数据分析工具之 Numpy

点击 上方 深度学习与先进智能决策 ”进入

以爱与青春为名,陪你一路成长

Python是数据分析领域极受喜爱的主流程序语言。这里主要介绍 Numpy 的常用用法。如果你是从事数据分析、或者人工智能等相关领域,而所用的语言又是Python的话,以下知识点都应该 “张口就来” 。建议收藏,有事没事拿出来看两遍。

Numpy

在使用Numpy之前的话,我们需要先导入它:

import numpy as np

常用语句

  • 将数据转化为标量:

np.asscalar() # Convert an array of size 1 to its scalar equivalent.
  • 生成随机数:

np.random.seed(1233) 设置随机种子,随机种子一旦固定,每次生成的数据都会固定,除非改变种子,随机数才会发生改变。

rand 生成 均匀分布 随机数:

# 产生2行三列均匀分布随机数组
print(np.random.rand(2,3))

randn 生成 正太分布 随机数:

# 三行三列正态分布随机数据
print(np.random.randn(3,3))

randint 生成指定范围内 随机整数

# (1, 100)以内5行5列随机整数
print(np.random.randint(1,100,[5,5]))

random 生成10个 随机浮点数

# (0,1)内10个随机浮点数
print(np.random.random(10))

choice 给定范围内 随机选一个数

# [0,10)内10个随机选一个数
print(np.random.choice(10))

生成 正太分布 数据:

mu = 1
sigma = 2
num = 10
print(np.random.normal(mu, sigma, num))

按行 打乱数据

rand_data = np.random.randint(1, 10, (3, 4))
np.random.shuffle(rand_data)

创建数组

我们主要用 numpy 来创建数组,或者称之为构造变量,当然自己一个一个变量敲进电脑也是可以的,用numpy的话就会方便一点。

  • 手动创建一维的变量:

a = np.array([1,2,3],dtype=np.int32)

dtype 是设置你创建变量的类型,你也可以选择 float 类型,这都没啥问题。如果把上面的代码 print 显示出来的话,如下所示:

>>>[1 2 3]
  • 手动创建二维的变量:

b = np.array([[1,2],[3,4],[5,6]],dtype=np.int32)

这样我们就能生成两行三列的数组,结果如下所示:

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

arange

  • arange 创建一维数组

我们创建的数组如果比较小的话,我们可以手动输入,但是如果比较大了的话,我们手动输入就太费事了,需要调用一些函数,像 arange 函数就可以很方便地创建一维数组:

c = np.arange(1,10,2)

代码所表示的意思就是,从1到10,每隔两个数字产生,输出显示出来就是:

>>>[1 3 5 7 9]

这样产生的数据类型是 numpy.ndarray ,dtype是 int64

linspace

  • linspace 产生等差数列

比如我们想从数字1到11产生5个数字,这些数字之间都是等间隔的:

d = np.linspace(1,11,5)

结果显示如下所示:

>>>[ 1.   3.5  6.   8.5 11. ]

这里的dtype是 float64

logspace

  • logspace 创建等比数列

从1到10产生八个等比数列:

e = np.logspace(1,10,8)

结果显示如下所示:

>>>[1.00000000e+01 1.93069773e+02 3.72759372e+03 7.19685673e+04
 1.38949549e+06 2.68269580e+07 5.17947468e+08 1.00000000e+10]

fromfunction

  • fromfunction 创建数组

该函数的第一个参数为计算数据元素的函数;第二个参数是代表 数组的大小的序列 ,序列的每一个值代表数组对应维度的大小。

def funcA(i):
    return i+i
f = np.fromfunction(funcA, (10,))

结果显示如下所示:

>>>[ 0.  2.  4.  6.  8. 10. 12. 14. 16. 18.]

如果是两维数据做运算的话,代码如下所示:

def funcB(i,j):
    return i+j
g = np.fromfunction(funcB, (3,2))

结果显示如下所示:

>>>[[0. 1.]
 	[1. 2.]
 	[2. 3.]]

shape和reshape

除了产生数组之外,我们还会经常改变数组的维度,这就要求我们查看 shape 并使用 reshape 函数。

  • shape 函数查看数组大小

实现如下所示:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a.shape)

结果显示如下所示:

>>>(3, 2)
  • reshape 函数改变数组维度

实现如下所示:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a.reshape(2,3))

结果显示如下所示:

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

获取数组元素

上面是如何生成数组,那我们如何从数组中拿元素呢?这里的操作就跟列表的操作类似了:

  • 取其中某一个元素:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a[0][1])

结果显示如下所示:

  • 取数组后半部分:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a[0][0:])

结果显示如下所示:

>>> [1 2]
  • 取数组前半部分:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a[0][:-1])

结果显示如下所示:

>>> [1]
  • 每隔两个取:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print(a[0::2])

结果显示如下所示:

>>> [[1 2]
 	 [5 6]]
  • 依据下标能获取共享地址

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
b=a[:]
print('b',b)
b[2,0]=10
print('a',a)

结果显示如下所示:

>>> b [[1 2]
 	   [3 4]
       [5 6]]
    a [[ 1  2]
       [ 3  4]
       [10  6]]
  • 依据整数序列不与原数组共享地址:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
b=a[[2]]
print('b',b)
b[0,0]=10
print('a',a)

结果显示如下所示:

>>> b [[5 6]]
	a [[1 2]
 	   [3 4]
 	   [5 6]]
  • 使用bool数组作为下标获取数据:

a = np.array([[1,2,],[3,4],[5,6]],dtype=np.int32)
print('bool',a>2)
print('a>2',a[a>2])

结果显示如下所示:

>>> bool: [[False False]
 		  [ True  True]
          [ True  True]]
     a>2: [3 4 5 6]

ufunc函数

ufunc 的全称是 universal function ,即通用处理函数。 Numpy 提供的 ufunc 函数大致可以划分为五类:分别为: Math operations (数学操作)、 Trigonometric function (三角函数)、 Bit-twiddling function (位操作)、 Comparison function (比较函数)以及 Floating function (浮点函数)。

  • 加法运算:

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

结果显示如下所示:

>>> [ 6.  8. 10. 12.]
  • 减法运算:

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

结果显示如下所示:

>>> [-4. -4. -4. -4.]
  • 三角函数:

主要有 np.sinnp.cos 等,其参数并不直接代表三角函数的度数,而是使用 pi 替代。

  • 位操作函数

包含按位的与、或、异或、左移、右移等操作:

a = np.binary_repr(5)
b = np.binary_repr(7)
c = np.bitwise_and(5,7)
d = np.bitwise_or(5,7)
e = np.left_shift(5,2)
f = np.right_shift(5,2)
print('a:{}, b:{}, c:{}, d:{}, e:{}, f:{}'.format(a,b,c,d,e,f))

结果显示如下所示:

>>> a:101, b:111, c:5, d:7, e:20, f:1
  • 比较函数:

包含了 数值比较逻辑运算取最大值取最小值 等操作。

1. 比大小 greater 函数 :

a = np.array([1,5])
b = np.array([0,10])
print(np.greater(a, b))

结果显示如下所示:

>>> [ True False]

2. 比相等 equal 函数

a = np.array([0,5])
b = np.array([0,10])
print(np.equal(a, b))

结果显示如下所示:

>>> [ True False]

3. 逻辑判断 logical_and 函数 :

x = np.arange(1,5)
print(np.logical_and(x>1, x<3))

结果显示如下所示:

>>> [False  True False False]

4. 浮点函数

包含了类型判别、是否是最大值、向上取整等操作

a. 如果具有非零虚部,则比较复杂:

x = [3+1j, 6+0j, 7.5, 6, 2j]
print(np.iscomplex(x))

结果显示如下所示:

>>> [ True False False False  True]

b. 判断是否是无穷大:

print(np.isinf(np.inf))

结果:

>>> [ True False False False  True]

c. 向正无穷取整:

x = [2.1, -2.1, 3.54, 7.2, -7.2]
print(np.ceil(x))

结果:

>>> [ 3. -2.  4.  8. -7.]

d. 取下界:

x = [2., -3., 3., 7., -8.]
print(np.floor(x))

结果:

>>> [ 2. -3.  3.  7. -8.]

文件IO

Numpy 提供一些文件存取操作,方便将 ndarray 数组元素存储到文件以及从文件读取数据来初始化数组。其中 tofilefromfile 以二进制形式的方式存取; saveload 函数以Numpy的专有格式存取; savez 可以 保存多个数组 到同一个文件,并可以通过 load 循环取出。 tofilefomfile 示例如下:

  • tofilefromfile 示例 :

x = np.array([2.1, -2.1, 3.54, 7.2, -7.2])
x.tofile('a.bin')
y = np.fromfile('a.bin',dtype=np.float64)
print(y)

结果:

>>> [ 2.1  -2.1   3.54  7.2  -7.2 ]
  • saveload 示意 :

x = np.array([2.1, -2.1, 3.54, 7.2, -7.2])
x.tofile('a.bin')
y = np.fromfile('a.bin',dtype=np.float64)
print(y)

结果:

>>> [ 2.1  -2.1   3.54  7.2  -7.2 ]
  • savezload 示例 :

a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3])
c = np.array([1.2,3.1,3.3])
np.savez('data.npz',a,b,c)
arr = np.load('data.npz')
print('arr_0',arr['arr_0'])
print('arr_1',arr['arr_1'])
print('arr_2',arr['arr_2'])

结果:

>>> arr_0 [[1 2 3]
 		   [4 5 6]]
	arr_1 [1 2 3]
	arr_2 [1.2 3.1 3.3]

深度学习与先进智能决策-交流群已成立啦!

微信群有国际Top期刊作者、高等学府博士生、硕士生等多位学者 致力于纯学术探讨,方向不限(一个好的学者必定是交叉学科下的产物) 想要进群一起学习探讨的童鞋可加工作人员微信 ,备注 学术交流 、你也可以选择 技术交流

注意 无需备注出身(英雄不问出处),打广告的就不要来了,我自己都不在群里推送自己的公众号文章,抱拳了! 加作者微信: MultiAgent1024- (注意后面有小-) ,拉你进群。

▲扫码关注我们

在看 了吖!

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章