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) • 1
dtype
是设置你创建变量的类型,你也可以选择float
类型,这都没啥问题。如果把上面的代码print
显示出来的话,如下所示:
>>>[1 2 3] • 1
- 手动创建二维的变量:
b = np.array([[1,2],[3,4],[5,6]],dtype=np.int32) • 1
这样我们就能生成两行三列的数组,结果如下所示:
>>>[[1 2] [3 4] [5 6]]
arange
arange
创建一维数组:
我们创建的数组如果比较小的话,我们可以手动输入,但是如果比较大了的话,我们手动输入就太费事了,需要调用一些函数,像arange
函数就可以很方便地创建一维数组:
c = np.arange(1,10,2) • 1
代码所表示的意思就是,从1到10,每隔两个数字产生,输出显示出来就是:
>>>[1 3 5 7 9] • 1
这样产生的数据类型是numpy.ndarray
,dtype是int64
。
linspace
linspace
产生等差数列:
比如我们想从数字1到11产生5个数字,这些数字之间都是等间隔的:
d = np.linspace(1,11,5) • 1
结果显示如下所示:
>>>[ 1. 3.5 6. 8.5 11. ] • 1
这里的dtype是float64
logspace
logspace
创建等比数列:
从1到10产生八个等比数列:
e = np.logspace(1,10,8) • 1
结果显示如下所示:
>>>[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.] • 1
如果是两维数据做运算的话,代码如下所示:
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) • 1
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])
结果显示如下所示:
>>> 2 • 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] • 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.] • 1
- 减法运算:
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.] • 1
- 三角函数:
主要有np.sin
;np.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
- 比较函数:
包含了数值比较、逻辑运算、取最大值、取最小值等操作。
1. 比大小greater
函数:
a = np.array([1,5]) b = np.array([0,10]) print(np.greater(a, b))
结果显示如下所示:
>>> [ True False] • 1
2. 比相等equal
函数:
a = np.array([0,5]) b = np.array([0,10]) print(np.equal(a, b))
结果显示如下所示:
>>> [ True False] • 1
3. 逻辑判断logical_and
函数:
x = np.arange(1,5) print(np.logical_and(x>1, x<3))
结果显示如下所示:
>>> [False True False False] • 1
4. 浮点函数:
包含了类型判别、是否是最大值、向上取整等操作
a . 如果具有非零虚部,则比较复杂:
x = [3+1j, 6+0j, 7.5, 6, 2j] print(np.iscomplex(x))
结果显示如下所示:
>>> [ True False False False True] • 1
b. 判断是否是无穷大:
print(np.isinf(np.inf)) • 1
结果:
>>> [ True False False False True] • 1
c. 向正无穷取整:
x = [2.1, -2.1, 3.54, 7.2, -7.2] print(np.ceil(x))
结果:
>>> [ 3. -2. 4. 8. -7.] • 1
d. 取下界:
x = [2., -3., 3., 7., -8.] print(np.floor(x))
结果:
>>> [ 2. -3. 3. 7. -8.] • 1
文件IO
Numpy
提供一些文件存取操作,方便将ndarray
数组元素存储到文件以及从文件读取数据来初始化数组。其中tofile
、fromfile
以二进制形式的方式存取;save
、load
函数以Numpy的专有格式存取;savez
可以保存多个数组到同一个文件,并可以通过load
循环取出。tofile
,fomfile
示例如下:
tofile
和fromfile
示例:
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 ] • 1
save
和load
示意:
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 ] • 1
savez
、load
示例:
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]
我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!