Numpy的索引和ufunc

一、基本的索引和切片:

1、数组索引

    返回来的都是视图,并不会对数据进行复制,如果想复制可以使用copy()

arr=np.arange(10)
print(arr)
arr[5]=8
print(arr)
arr[2:5]=6
print(arr)

输出结果:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array([0, 1, 2, 3, 4, 8, 6, 7, 8, 9])
array([0, 1, 6, 6, 6, 8, 6, 7, 8, 9])

    numpy 设计的目的是处理大数据,如果每次操作都把数据进行复制,那会产生很大的性能浪费。如果需要得到副本而不是视图,则需要进行显式地复制, arr[5:8].copy()

2、切片索引

    ndarry 地切片语法和 python 列表地一维对象差不多,如果是多维度地 ndarray 还可以在多个轴进行切片,也可以跟整数索引混合使用。如果是只用:的切片,那会得到和 array 相同维度地视图

arra2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
arra2d[:2,1:]
arra2d[:2,1:2]
arra2d[2:]

输出结果:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
array([[2, 3],
[5, 6]])
array([[2],
[5]])
array([[7, 8, 9]])

    可以看到,使用了非整数的切片,得到的都还是二维数组。这是因为如果只有一个冒号(:)是对整个轴进行选取的,冒号两边的数字只不过是对轴数量限制,但还是轴。

# 如果使用了整数的切片,就会降维
arra2d[1:,2]
arra2d[2,2]

输出结果:
array([6, 9])
9

注意:切片索引和数组索引返回来的都是视图(布尔索引返回来的是副本),所以对切片的操作也会影响到原数据。

# 使用视图对原数据进行修改
arra2d[:,:]=2

输出结果:
array([[2, 2, 2],
[2, 2, 2],
[2, 2, 2]])

3、布尔型索引

    布尔型索引的长度必须跟被索引的轴一致(先写就是横轴,后写就是纵轴),还可以将布尔型数组和切片、整数 或 整数序列进行混合使用

names=np.array(['bob','joe','ang','will'])
data=np.random.randn(4,3)
data[names=='bob']

输出结果:
array(['bob', 'joe', 'ang', 'will'],
dtype='<U4')
array([[-0.09280068, 0.58965549, 0.00679073],
[ 0.64898363, 0.28057725, -0.31246341],
[ 0.76704748, 1.56162526, -1.27835386],
[ 1.70463106, -1.6897867 , -1.31967934]])
array([[-0.09280068, 0.58965549, 0.00679073]])

# 布尔索引和整数一起混合使用
data[names=='bob',2:]

输出结果:
array([[ 0.00679073]])

如果有多个条件,可以用 & | ! (与或非),并且非还可以通过加负号的形式实现

# 使用整数索引,会降维
data[(names=='bob')|(names=='ang'),2]

输出结果:
array([ 0.00679073, -1.27835386])

应用,可以批量修改数据,例如把所有负数变成0
data[data<0]=0

注意:通过布尔型索引选取数组的数据,将总会创建副本,即使返回的数据一模一样也是如此。

4、花式索引

    花式索引是Numpy 得一个术语,它指的是利用整数数组进行索引。如果想以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或者 ndarray 就可以了,甚至还可以用负数。

arr = np.empty((8,4))
for i in range(8):
    arr[i]=i
arr[[4,3,0,6]]
arr[[-1,2,4]]

输出结果:
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
array([[ 7., 7., 7., 7.],
[ 2., 2., 2., 2.],
[ 4., 4., 4., 4.]])

多轴花式索引: 会返回交叉位置的数据
arr[[1,5,7,2],[0,3,1,2]]
输出结果:
array([ 1., 5., 7., 2.])

如果不想选取对应位置的数,可以使用 np.ix_ 函数

index = np.ix_([1,5,7,2],[0,3,1,2])
arr[index]

输出结果: 是一个元组,元组里面
(array([[1],
[5],
[7],
[2]]), array([[0, 3, 1, 2]]))
array([[ 1., 1., 1., 1.],
[ 5., 5., 5., 5.],
[ 7., 7., 7., 7.],
[ 2., 2., 2., 2.]])

注意:花式索引会复制数据

二、通用函数:快速的元素级数组函数

    通用函数(即 ufunc)是一种对 ndarray 种的数据执行元素级运算的函数。可以将其看作是简单函数的矢量化包装器。(接受一个可变参数,给任意个标量数据都可以返回任意个值)

arr=np.arange(10).reshape(2,5) 
np.sqrt(arr) 
np.exp(arr)

输出结果:
array([[ 0. , 1. , 1.41421356, 1.73205081, 2. ], [ 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ]])

array([[ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01], [ 1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03]])

    sqrt、exp 都是一元的 ufunc,另外一些(如 add 或者 maximum) 则可以接受2个参数,叫做二元通用函数。

123.png
x = np.random.randn(8) 
y = np.random.randn(8) 
# 对比返回大的值 
np.maximum(x,y)

输出结果:
array([-0.10488341, -1.18010624, 0.46492552, 0.58947382, -0.01015324, 2.08139131, 0.35234464, -0.82338906])
array([-1.30925346, -0.14092102, 0.56775544, 1.46416221, 0.67749745, -1.22717291, -0.50538792, 0.95247714])
array([-0.10488341, -0.14092102, 0.56775544, 1.46416221, 0.67749745, 2.08139131, 0.35234464, 0.95247714])

    有些 ufunc 可以返回多个数组,但是比较少见,modf 就是一个例子,它是 Python 内置函数,它是Python内置函数 divmod 的矢量化版本,用于浮点数组的小数和整数部分。

# 得到两个数组组成的元组,一个是小数部分数据,一个是整数部分的数据 
np.modf(y)

输出结果: 前面是小数部分,后面是整数部分
(array([-0.30925346, -0.14092102, 0.56775544, 0.46416221, 0.67749745, -0.22717291, -0.50538792, 0.95247714]), array([-1., -0., 0., 1., 0., -1., -0., 0.]))

根据通用函数的参数个数,可以划分为 一元ufunc 和 二元ufunc

一元 ufunc :
sqrt、cos、floor、modf

二元 ufunc :
add、maximum、mod

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容