python numpy

0.axis的意义

Pandas保持了Numpy对关键字axis的用法,用法在Numpy库的词汇表当中有过解释:

轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。

如果简单点来说,就是0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算。

https://www.zhihu.com/question/58993137

1.numpy.random.randn

numpy.random.randn(d0, d1, ..., dn)

d0, d1, …, dn:应该为正整数,表示维度。

如果没有参数,则返回一个值,如果有参数,则返回(d0, d1, …, dn)个值,这些值都是从标准正态分布中随机取样得到的。

For random samples from N(\mu, \sigma^2), use:

sigma np.random.randn(...) mu

 

2.numpy.random.rand

numpy.random.rand(d0, d1, ..., dn)

d0, d1, ..., dn :返回数组的尺寸,都应该是正的。

创建一个给定类型的数组,将其填充在一个均匀分布的随机样本[0, 1)中

 

3.numpy.reshape

Gives a new shape to an array without changing its data.

>>> a = np.array([[1,2,3], [4,5,6]])
>>> np.reshape(a, 6)
array([1, 2, 3, 4, 5, 6])
>>> np.reshape(a, (3,-1))       # the unspecified value is inferred to be 2
array([[1, 2],
       [3, 4],
       [5, 6]])

4.shape函数

shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。

>>> e = eye(3)  
>>> e  
array([[ 1.,  0.,  0.],  
       [ 0.,  1.,  0.],  
       [ 0.,  0.,  1.]])  
>>> e.shape  
(3, 3)  

建立一个4×2的矩阵c, c.shape[1] 为第一维的长度,c.shape[0] 为第二维的长度。

>>> c = array([[1,1],[1,2],[1,3],[1,4]])  
>>> c.shape  
(4, 2)  
>>> c.shape[0]  
4  
>>> c.shape[1]  
2  

 

5.numpy.zeros

用法:zeros(shape, dtype=float, order='C')

返回:返回来一个给定形状和类型的用0填充的数组;

参数:shape:形状

            dtype:数据类型,可选参数,默认numpy.float64

            dtype类型:t ,位域,如t4代表4位

                                 b,布尔值,true or false

                                 i,整数,如i8(64位)

                                u,无符号整数,u8(64位)

                                f,浮点数,f8(64位)

                               c,浮点负数,

                                o,对象,

                               s,a,字符串,s24

                               u,unicode,u24

            order:可选参数,c代表与c语言类似,行优先;F代表列优先

例子:

np.zeros(5)
array([ 0.,  0.,  0.,  0.,  0.])
s = (2,2)
np.zeros(s)
array([[ 0.,  0.],
       [ 0.,  0.]])

 

6.argsort()

1.先定义一个array数据

import numpy as np
x=np.array([1,4,3,-1,6,9])

2.现在我们可以看看argsort()函数的具体功能是什么:

x.argsort()

输出定义为y=array([3,0,2,1,4,5])。

我们发现argsort()函数是将x中的元素从小到大排列提取其对应的index(索引),然后输出到y

3.由于在程序中遇到了类似于np.argsort()[num]的形式,一直看不明白,就自己去python环境自己试了下:

ps:这里的num的绝对值小于等于x中元素的个数

当num>=0时,np.argsort()[num]就可以理解为y[num];

当num<0时,np.argsort()[num]就是把数组y的元素反向输出,例如np.argsort()[-1]即输出x中最大值对应的index,np.argsort()[-2]即输出x中第二大值对应的index,依此类推。。

直观的实验才能看到效果,下面是我拿上面例子做的验证:

这是当num为负值时的输出

这个是num>=0时的输出。

 

7.dot()

dot()函数是矩阵乘,而*则表示逐个元素相乘

 

8.random.choice()

可以从一个int数字或1维array里随机选取内容,并将选取结果放入n维array中返回。

numpy.random.choice(a, size=None, replace=True, p=None)

a : 1-D array-like or int If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a was np.arange(n)

size : int or tuple of ints, optional

replace : boolean, optional Whether the sample is with or without replacement

p : 1-D array-like, optional The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a.

9.numpy.flatnonzero():

该函数输入一个矩阵,返回扁平化后矩阵中非零元素的位置(index)

这是官方文档给出的用法,非常正规,输入一个矩阵,返回了其中非零元素的位置

>>> x = np.arange(-2, 3)
>>> x
array([-2, -1,  0,  1,  2])
>>> np.flatnonzero(x)
array([0, 1, 3, 4])

用来返回某个特定元素的位置:

对向量元素的判断d==3返回了一个和向量等长的由0/1组成的矩阵,然后调用函数,返回的位置,就是对应要找的元素的位置。

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

 

10.numpy.bincount

计数非负整数数组中每个值的出现次数。

bin的数量比数组中的最大值大1,每个bin给出了它的索引值在数组中出现的次数。

# 我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([0, 1, 1, 3, 2, 1, 7])
# 索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
#因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])

# 我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([7, 6, 2, 1, 4])
# 索引0出现了0次,索引1出现了1次......索引5出现了0次......
np.bincount(x)
#输出结果为:array([0, 1, 1, 0, 1, 0, 1, 1])

 11.np.linspace

linspace可以用来实现相同间隔的采样。

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

返回值为numpy.ndarray。

linspace(a,b,c)均匀生成介于a到b的c个值,c默认为100
如linspace(0,100,5)即[0 25 50 75 100]
linspace(-1.3,1.3)就是生成介于-1.3到1.3的100个值

12.meshgrid

meshgrid是生成网格的函数,一般是生成二维网格矩阵数据,但这里生成的是三维网格矩阵数据。
先以二维数据为例,
比如要绘制函数z=f(x,y)的图像
x方向在[1,2,3,4,5]五个点上采样,即x=1:5
y方向在[10 20 30 40]四个点上采样,即y=10:10:40
那么就一共有5*4=20个采样点。
分别为
(1,10) (2,10) (3,10) (4,10) (5,10)
(1,20) (2,20) (3,20) (4,20) (5,20)
(1,30) (2,30) (3,30) (4,30) (5,30)
(1,40) (2,40) (3,40) (4,40) (5,40)
命令
[X,Y]=meshgrid(x,y)
生成的X就是这20个采样点的横坐标,Y既是其纵坐标,即
X=
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Y=
10 10 10 10 10
20 20 20 20 20
30 30 30 30 30
40 40 40 40 40
然后再对这20个采样点计算z的值,即Z=f(X,Y),最后用mesh(X,Y,Z)即可绘制图像

三维网格数据与此类似,现在xyz三个方向都是取-1.3到1.3的100个数据,总共就是100^3即一百万个采样点,[x,y,z]=meshgrid(linspace(-1.3,1.3));中的x,y和z就分别是这一百万个采样点的三个维度上的坐标。 

 

13.concatenate()

numpy.concatenate((a1, a2, ...), axis=0)

a1, a2, ... : 需要拼接的矩阵

axis : 沿着某个轴拼接,默认为列方向

举个例子:

In [1]: import numpy as np

In [2]: a = np.array([[1,2,3],[4,5,6]])

In [3]: b = np.zeros((3,3))

In [4]: c = np.ones((4,3))

In [5]: d = np.concatenate((a,b,c))

In [6]: print d

输出结果:  

[[ 1.  2.  3.]

 [ 4.  5.  6.]

 [ 0.  0.  0.]

 [ 0.  0.  0.]

 [ 0.  0.  0.]

 [ 1.  1.  1.]

 [ 1.  1.  1.]

 [ 1.  1.  1.]

 [ 1.  1.  1.]]

 14.np.mean

求行或列的平均值

axis=0 求列的平均值

axis=1 求行的平均值

>>> a = np.array([[1, 2], [3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis=0)
array([ 2.,  3.])
>>> np.mean(a, axis=1)
array([ 1.5,  3.5])

 

answer=np.array([1, 0, 1, 1, 1, 1])  
y=np.array([0, 0, 0, 0, 0, 1])  
print(answer==y)  

结果: [False True False False False True]

 

answer=np.array([1, 0, 1, 1, 1, 1])  
y=np.array([0, 0, 0, 0, 0, 1])  
print(np.mean(answer == y[test]))  
结果:  
0.333333333333  

说明:
       1、 answer == y表示两个数组中的值相同时,输出True;否则输出False
       2、例3对例2中结果取平均值,其中True=1,False=0;

 

15.Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()

16.np.copy 

numpy关于copy有三种情况,完全不复制、视图(view)或者叫浅复制(shadow copy)和深复制(deep copy)。

而 b = a[:] 这种形式就属于第二种,即视图,这本质上是一种切片操作(slicing),所有的切片操作返回的都是视图。具体来说,b = a[:]会创建一个新的对象 b(所以 id(b) 和id(a) 返回的结果是不一样的),但是 b 的数据完全来自于a,和 a 保持完全一致,换句话说,b的数据完全由a保管,他们两个的数据变化是一致的,可以看下面的示例:

a = np.arange(4)  # array([0, 1, 2, 3])
b = a[:]  # array([0, 1, 2, 3])

b.flags.owndata  # 返回 False,b 并不保管数据
a.flags.owndata  # 返回 True,数据由 a 保管

# 改变 a 同时也影响到 b
a[-1] = 10  # array([0, 1, 2, 10])
b  #  array([0, 1, 2, 10])

# 改变 b 同时也影响到 a
b[0] = 10  # array([10, 1, 2, 10])
a  # array([10, 1, 2, 10])

b = a 和 b = a[:] 的差别就在于后者会创建新的对象,前者不会。两种方式都会导致 a 和 b 的数据相互影响。

要想不让 a 的改动影响到 b,可以使用深复制:

unique_b = a.copy()

 

posted @ 2018-04-28 09:40  喵喵帕斯  阅读(462)  评论(0编辑  收藏  举报