查看原文
其他

入门numpy(65%-80%)【解读numpy官方文档】

2017-07-28 王大伟 Python爱好者社区

作者:王大伟

Python爱好者社区唯一小编

博客:https://ask.hellobi.com/blog/wangdawei


点击上图即可限时半价购买课程

前言

好久没更新了,最近一直在忙,今天继续连载。


花式索引和索引技巧

1

索引与指数索引

import numpy as np

a = np.arange(12)**2
a


注:产生0-11的平方组成一个数组


i = np.array( [ 1,1,3,8,5 ] )
i


注:产生一个数组


a[i]


注:以数组i为索引,取a数组中的数


j = np.array( [ [ 3, 4], [ 9, 7 ] ] )
a[j]  


注:以j数组为索引,取a数组中的数,根据j数组的格式(二维)产生新格式的a数组


当索引数组a为多维时,单个索引数组指的是a的第一个维度。 以下示例通过使用调色板将标签的图像转换为彩色图像来显示此行为

palette = np.array( [ [0,0,0],                # 黑色
                     [255,0,0],              # 红色
                     [0,255,0],              # 绿色
                     [0,0,255],              # 蓝色
                     [255,255,255] ] )       # 白色

注:创建一个调色板(二维数组,包括几种常见颜色的RGB)


image = np.array( [ [ 0, 1, 2, 0 ],          
                   [ 0, 3, 4, 0 ]  ] )

注:每个值对应于调色板中的一种颜色


palette[image]


注:以image数组为索引,取对应数组palette中的值(最后的数组格式与image数组格式一致)


我们还可以为多个维度提供索引。 每个维度的索引数组必须具有相同的形状。


a = np.arange(12).reshape(3,4)
a


注:创建一个数组,再将其变形为3行4列


i = np.array( [ [0,1],
                [1,2] ] )
i


注:为第一维创建索引数组做准备


j = np.array( [ [2,1],
               [3,3] ] )
j


注:为第二维创建索引数组做准备


a[i,j]


注:以i,j数组成对作为索引,取出对应a数组的值(i,j数组必须同形状)


a[i,2]


注:以数组i为行索引,以2为列索引,在a数组中取值


a[:,j]


注:以j数组为列索引,在a数组每行分别取值


当然,我们可以把i和j放在一个序列中(比如一个列表),然后用列表进行索引。

l = [i,j]
l


注:将i,j数组合并为l列表作为索引


a[l]


注:以列表l作为索引在a数组中取值


但是,我们不能将i和j放入数组中(可以放在列表中),因为这个数组将被解释为索引a的第一维,如下图会报错:



a[tuple(s)]


注:转化成元组和列表类似作为索引,也是可以的


使用数组索引的另一个常见用途是搜索时间相关序列的最大值:

time = np.linspace(20, 145, 5)
time


注:在20到145之间等间隔产生5个数(包括两个端点)


data = np.sin(np.arange(20)).reshape(5,4)
data


注:产生一个5行4列的正弦函数数组


ind = data.argmax(axis=0)
ind


注:返回data数组每列最大值的索引


ind = data.argmax(axis=1)
ind


注:返回data数组每行最大值的索引

这部分之后有一些官方文档代码在我的电脑上运行错误,我的是Python3版本


也可以使用索引作为目标分配给数组

a = np.arange(5)
a


注:创建一个a数组


a[[1,3,4]] = 0
a

 

注:通过传入索引对a数组的给定位置元素重新赋值


但是,当索引列表包含重复时,完成多次赋值操作,留下最后一次操作的值:

a = np.arange(5)
a[[0,0,2]]=[1,2,3]
a


注:这里的索引0位置被两次赋值,我们保留的是最后一次赋值的2


这是足够合理的,但要注意,如果你想使用Python的+=构造,它可能不会做你期望的:

a = np.arange(5)
a[[0,0,2]]+=1
a


注:索引2的值确实加2了,但是索引0的只并没有像预期加2,而只加了1


2

使用布尔数组进行索引


当我们使用整数索引的数组来索引数组时,我们提供要选择的索引列表。 使用布尔索引的方法是不同的; 我们明确地选择了我们想要的数组中的哪些项目以及我们不需要哪些项目。

使用布尔索引的最自然的方式是使用与原始数组相同形状的布尔数组:

a = np.arange(12).reshape(3,4)
b = a > 4
b


注:b为和a形状一样的布尔数组(a中对应元素与4比较得出)


a[b]


注:取出a数组中,索引为b数组中True的值


此属性在非常有用:

a[b] = 0
a


注:a数组中比4大的元素都赋值为0


你可以查看以下示例来了解如何使用布尔索引生成Mandelbrot集的映像:

Mandelbrot集的wiki解释:https://en.wikipedia.org/wiki/Mandelbrot_set

import numpy as np
import matplotlib.pyplot as plt

def mandelbrot(h,w,maxit=20):
   """Returns an image of the Mandelbrot fractal of size (h,w)."""
   y,x = np.ogrid[-1.4:1.4:h*1j,-2:0.8:w*1j]
   c = x+y*1j
   z = c
   divtime = maxit + np.zeros(z.shape, dtype=int)

   for i in range(maxit):
       z = z**2 + c
       diverge = z*np.conj(z) > 2**2            # who is diverging
       div_now = diverge & (divtime==maxit)  # who is diverging now
       divtime[div_now] = i                  # note when
       z[diverge] = 2                        # avoid diverging too much

   return divtime
plt.imshow(mandelbrot(400,400))
plt.show()

 


布尔索引的第二种方式更类似于整数索引; 对于数组的每个维度,我们给出一个选择我们想要的切片的一维布尔数组:

a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])  
b2 = np.array([True,False,True,False])
a[b1,:]


注:a是3行4列数组,使用b1切片出后面两行(因为b1中后两个元素是True,即True对应的a中的行被切出来)


这同样可以写为:

a[b1]



a[:,b2]


注:a是3行4列数组,使用b2切片出第一第三列(因为b1中后第一第三个元素是True,即True对应的a中的列被切出来)


a[b1,b2]


注:同时使用b1,b2切片,即都是True的位置交叉点被切出来,2行1列位置的4,3行3列位置的10被切出来


未完待续~还有最后一篇~谢谢观赏~希望对你学习有帮助~

微课福利:Hellobi live |8月22日,利用 Python 建构金融数据分析平台

查看下图说明免费参加或者点击文末阅读原文参加

关注公众号,“Python爱好者社区”,回复“爬虫”即可获取崔老师爬虫免费学习视频。


Python爱好者社区


为大家提供与Python相关的最新技术和资讯。

长按指纹 > 识别图中二维码 > 添加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存