[python][科学计算][numpy]使用指南6-重构

最后一次更新日期: 2019/4/13

NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象(ndarray)和用于处理数组的例程集合组成的库。
使用NumPy,开发人员可以执行以下操作:

  • 数组的算数和逻辑运算。
  • 傅立叶变换和用于图形操作的例程。
  • 与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

使用前先导入模块:
import numpy as np

1. 类型转换

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

In [620]: a.dtype
Out[620]: dtype('int32')

In [621]: a=a.astype('float64')

In [622]: a.dtype
Out[622]: dtype('float64')

In [623]: a=np.int32(a)

In [624]: a.dtype
Out[624]: dtype('int32')

使用ndarray.astype方法或是使用数据类型同名方法都可以转换类型,关于numpy支持的数据类型可以查看属性章节。转换类型后返回一个新数组。

2. 重塑

(1). 改变形状
In [625]: a=np.array([[1,2],[3,4]])

In [626]: a.reshape((1,4))
Out[626]: array([[1, 2, 3, 4]])

In [627]: a.reshape((-1,4))
Out[627]: array([[1, 2, 3, 4]])

使用tuple类型的参数声明新的形状。允许有一个新轴的大小为-1,表示自动计算。
改变前后元素数size需要保持一致。元素在轴上的排列是从最后一个轴开始往前面的轴方向上堆叠,见如下图示,可通过order参数指定其他排序方式。轴的相对位置不会改变,所以一些复杂的变形可能需要结合transposeswapaxes此类轴交换方法使用。

(2). 平铺
In [640]: a.ravel()
Out[640]: array([1, 2, 3, 4])

In [641]: a.flatten()
Out[641]: array([1, 2, 3, 4])

将数组平铺为向量,等效于reshape((-1,)),可通过order参数指定其他排序方式。

(3). 转置
In [643]: a.T
Out[643]: 
array([[1, 3],
       [2, 4]])

数组为一维时转置无效,为二维时即矩阵的转置,多于二维时交换第一个和最后一个轴。

(4). 轴交换
In [646]: a.swapaxes(0,1)
Out[646]: 
array([[1, 3],
       [2, 4]])

In [647]: a.transpose([1,0])
Out[647]: 
array([[1, 3],
       [2, 4]])

swapaxes一次只能指定两个轴进行交换,transpose可以重新为所有轴排序。

3. 排序

(1). 直接排序
In [734]: a=np.array([[2,3],[1,4]])

In [735]: np.sort(a,axis=None)
Out[735]: array([1, 2, 3, 4])

In [736]: a.sort(axis=0)

In [737]: a
Out[737]: 
array([[1, 3],
       [2, 4]])

ndarray.sort会直接在原数组上排序,可通过第一个参数axis指定排序的轴,会将沿着该轴方向的每个向量单独排序,默认-1,除沿最后一个轴外,指定其他轴都会在排序时生成数据的临时副本,因此沿最后一个轴排序最快。
等效方法np.sort,返回的是排序后的副本,还可指定axis=None,会将数组展开再排序。
当数组的维度具备实际含义时,直接排序会打乱数据结构,得到不被期望的结果,这种情况下需要使用间接排序。

(2). 间接排序
In [740]: a=np.array([[2,3,5],[1,1,4],[1,2,3]])

In [741]: a
Out[741]: 
array([[2, 3, 5],
       [1, 1, 4],
       [1, 2, 3]])

In [742]: idx1=np.argsort(a[:,0])

In [743]: a[idx1]
Out[743]: 
array([[1, 1, 4],
       [1, 2, 3],
       [2, 3, 5]])

In [744]: idx2=np.lexsort((a[:,0],a[:,2]))

In [745]: a[idx2]
Out[745]: 
array([[1, 2, 3],
       [1, 1, 4],
       [2, 3, 5]])

argsort可用于单键间接排序,lexsort可用于多键间接排序。

(3). 随机排序
In [763]: a=np.arange(12).reshape((3,4))

In [764]: a
Out[764]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [765]: np.random.shuffle(a)

In [766]: a
Out[766]: 
array([[ 4,  5,  6,  7],
       [ 0,  1,  2,  3],
       [ 8,  9, 10, 11]])

In [768]: idx=np.random.permutation(a.shape[1])

In [769]: a[:,idx]
Out[769]: 
array([[ 4,  5,  7,  6],
       [ 0,  1,  3,  2],
       [ 8,  9, 11, 10]])

方法一np.random.shuffle只能沿第一个轴进行随机排序,方法二是通过np.random.permutation,该方法也只能沿第一个轴随机排序,但在输入参数xint类型时,会对np.arange(x)进行随机排序,可以快速生成乱序索引,再通过索引查找得到乱序数组。

(4). 分区排序
In [799]: a=np.array([2,3,1,5,4,0,8])

In [800]: np.partition(a,1)
Out[800]: array([0, 1, 3, 5, 4, 2, 8])

In [801]: np.partition(a,4)
Out[801]: array([0, 1, 2, 3, 4, 5, 8])

分区排序是一种不完整的排序,用于不需要获取完整排序序列的情况下。该方法只保证kth指定位置的元素是正确排序的,其他小于该元素的元素前移,大于的后移。可用于快速找出第k大或第k小的元素。
也可通过ndarray.partition调用,axis参数指定轴方向,还有对应的np.argpartition用于获取分区后的索引。

4. 去重

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

In [776]: np.unique(a,return_index=True,return_inverse=True,return_counts=True,axis=None)
Out[776]: 
(array([1, 2, 3, 4]),
 array([4, 1, 0, 6], dtype=int64),
 array([2, 1, 1, 2, 0, 0, 3], dtype=int64),
 array([2, 2, 2, 1], dtype=int64))

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

In [778]: np.unique(a,axis=0)
Out[778]: 
array([[1, 3],
       [2, 4]])

axis指定去重的轴,默认None会将数组展开后再去重。
返回值一为去重后的有序值列表;
返回值二为唯一值在原数组中的索引,仅在return_index=True时提供;
返回值三为根据唯一值重建原数组的索引,仅在return_inverse=True时提供;
返回值四为唯一值的出现计数,仅在return_counts=True时提供。

5. 拆分

(1). 索引拆分

In [780]: a=np.arange(9).reshape((3,3))

In [781]: a[:2,:],a[2:,:]
Out[781]: 
(array([[0, 1, 2],
        [3, 4, 5]]), array([[6, 7, 8]]))

In [782]: a[a>2],a[~(a>2)]
Out[782]: (array([3, 4, 5, 6, 7, 8]), array([0, 1, 2]))

In [790]: idx=np.random.permutation(a.shape[0])

In [791]: sp_idx=int(a.shape[0]*0.8)

In [792]: a[idx[:sp_idx]],a[idx[sp_idx:]]
Out[792]: 
(array([[3, 4, 5],
        [6, 7, 8]]), array([[0, 1, 2]]))

最灵活的方式,复杂的拆分需要写较多的代码,可使用其他方法配合生成用于拆分的索引,比如使用np.digitize进行分箱。

(2). 拆分方法

In [802]: a=np.arange(8)

In [803]: np.split(a,2)
Out[803]: [array([0, 1, 2, 3]), array([4, 5, 6, 7])]

In [805]: np.split(a,[2,5])
Out[805]: [array([0, 1]), array([2, 3, 4]), array([5, 6, 7])]

In [806]: a=a.reshape((2,4))

In [807]: a
Out[807]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

In [809]: np.split(a,[1,3],axis=1)
Out[809]: 
[array([[0],
        [4]]), array([[1, 2],
        [5, 6]]), array([[3],
        [7]])]

第二个参数indices_or_sections指定分割方式,int类型表示等分数量,一维数组类型表示用于分割的索引值,例如[2,5]表示分割为a[:2],a[2:5],a[5:]
第三个参数axis可以指定轴方向。

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

推荐阅读更多精彩内容