码迷,mamicode.com
首页 > 其他好文 > 详细

Numpy总结

时间:2017-09-09 20:58:35      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:多维数组   logical   单位   列表   自动   元素   bin   import   序列   

1、 numpynumerical python的简称,调用时习惯使用import numpy as np

2、 ndarray称为n维数组对象,其中的所有元素必须是相同类型

3、 array函数将序列性对象转化为数组

>>> import numpy as np

>>> data=[[1,2,3,4],[5,6,7,8]]

>>> arr=np.array(data)

>>> arr

array([[1, 2, 3, 4],

[5, 6, 7, 8]])

 

4、 ndim返回数组的维度,shape返回一个表示数组各维度大小的元组,dtype返回数组的数据类型

>>> arr.ndim

2

>>> arr.shape

(2, 4)

>>> arr.dtype

dtype(‘int32‘)

 

5、 arrangePython内置函数range的数组版,返回的是一个数组而不是列表

>>> np.arange(5)

array([0, 1, 2, 3, 4])

 

6、 zerosones分别可以创建指定维度的全0或全1的数组

np.zeros((2,3))

Out[6]:

array([[ 0., 0., 0.],

[ 0., 0., 0.]])

np.zeros(5)

Out[7]: array([ 0., 0., 0., 0., 0.])

np.ones((2,3))

Out[9]:

array([[ 1., 1., 1.],

[ 1., 1., 1.]])

 

7、 empty可以创建一个没有任何具体值的数组

np.empty((2,3))

Out[10]:

array([[ 0.,  0.,  0.],

       [ 0.,  0.,  0.]])

 

np.empty((2,3,2))

Out[11]:

array([[[  7.74942607e-312,   3.16202013e-322],

        [  0.00000000e+000,   0.00000000e+000],

        [  0.00000000e+000,   7.60234188e-042]],

       [[  4.47166461e-062,   1.73323478e+185],

        [  1.31329715e-071,   5.22012831e-037],

        [  3.31261422e-033,   1.25824126e-075]]])

Np.empty不一定会返回全0数组,可能返回一些未初始化的垃圾值

 

8、 eye可以创建一个正方的n阶单位矩阵

np.eye(3)

Out[14]:

array([[ 1.,  0.,  0.],

       [ 0.,  1.,  0.],

       [ 0.,  0.,  1.]])

 

9、  ndarray的数据类型

1)   dtype可以显示数组的数据类型,

arr=np.array([3.7,-1.2,-2.6,0.5,12.9,10.1])

arr.dtype

Out[14]: dtype(‘float64‘)

2)   astype可以显式转换数组的数据类型

arr1=arr.astype(np.int16)   #指定转换为int16类型

arr1

Out[16]: array([ 3, -1, -2,  0, 12, 10], dtype=int16)

 

arr2=arr.astype(int)     #默认转换为int32类型

arr2 

Out[24]: array([ 3, -1, -2,  0, 12, 10])

arr2.dtype

Out[25]: dtype(‘int32‘)

 

10、      基本的索引和切片

arr=np.arange(10)

arr

Out[16]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[5:8]      #不是选取索引值为58对应的值,而是57对应的值

Out[17]: array([5, 6, 7])

arr[5:8]=12   #将一个标量值赋值给一个切片

arr

Out[19]: array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])

 

将一个标量值赋值给一个切片时,该值会自动传播(广播)到整个选区。

 

11、      两个等价的索引方式

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

arr[0][2]

Out[21]: 3

arr[0,2]

Out[22]: 3

 

12、      关于多维数组

对于2*2*3数组arr3d,第一个2表示arr3d包含2个子数组,后面的2*3表示每一个子数组的维度

arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

arr3d

Out[24]:

array([[[ 1,  2,  3],

         [ 4,  5,  6]],

        [[ 7,  8,  9],

         [10, 11, 12]]])

arr3d[1,1] (等价于arr3d[1][1])

Out[25]: array([10, 11, 12])

arr3d[1,1,1]

Out[27]: 11

 

13、      切片索引

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

arr2d[1,2]  #切片不含有冒号,因此只返回一个标量值,而不是一个数组

Out[30]: 6

arr2d[:2]   #只有含有冒号的切片才返回一个数组,且注意只返回最终索引值前一个对应的值

Out[29]:

array([[1, 2, 3],

        [4, 5, 6]])

arr2d[1,:2]  #切记只返回索引值前一个对应的值

Out[32]: array([4, 5])

 

根据切片中冒号的有无、位置可以判断返回结果中数组的有无与位置,仔细比较arr2d[:,0]arr2d[:,:1]

arr2d[:,0]   #逗号右边不含逗号,意味着每个向量第1个值返回一个标量值而不是一个数组

Out[33]: array([1, 4, 7])

arr2d[:,:1]  #逗号右边含逗号,意味着每个向量第1个值返回一个数组

Out[34]:

array([[1],

       [4],

       [7]])

对切片表达式的赋值操作也会被扩撒到整个选区

 

14、      布尔型索引

data=np.random.randn(7,4)

data

Out[32]:

array([[-0.45669705, -1.52395492, -0.68237624,  0.28242954],

       [ 0.13949345,  0.32292273, -1.69858774, -0.00997388],

       [-0.35983191,  0.65950176, -0.61423896, -1.40462237],

       ...,

       [ 0.32777344, -2.46573016, -1.10936753, -0.20069354],

       [ 0.02787376, -0.23166792,  1.50544933,  1.27843251],

       [ 0.41026094,  2.33371247,  0.02932889, -0.18193204]])

 

names==‘Bob‘

Out[35]: array([ True, False, False,  True, False, False, False], dtype=bool)

data[names==‘Bob‘]

Out[36]:

array([[-0.45669705, -1.52395492, -0.68237624,  0.28242954],

       [ 0.61920896,  0.67665097, -0.47702115,  0.23167565]])

 

可以将布尔型数组跟切片混合使用

data[names==‘Bob‘,2:]

Out[37]:

array([[-0.68237624,  0.28242954],

       [-0.47702115,  0.23167565]])

data[names==‘Bob‘,3]

Out[38]: array([ 0.28242954,  0.23167565])

 

可以使用不等于符号(!=)或负号(-)对条件进行否定

names!=‘Bob‘

Out[39]: array([False,  True,  True, False,  True,  True,  True], dtype=bool)

data[-(names==‘Bob‘)]

Out[41]:

array([[ 0.13949345,  0.32292273, -1.69858774, -0.00997388],

       [-0.35983191,  0.65950176, -0.61423896, -1.40462237],

       [ 0.32777344, -2.46573016, -1.10936753, -0.20069354],

       [ 0.02787376, -0.23166792,  1.50544933,  1.27843251],

       [ 0.41026094,  2.33371247,  0.02932889, -0.18193204]])

 

运用&(和)、|(或)来组合多个条件,python关键字and和or在布尔型数组中无效

mask=(names==‘Bob‘)|(names==‘Will‘)

mask

Out[43]: array([ True, False,  True,  True,  True, False, False], dtype=bool)

data[mask]

Out[44]:

array([[-0.45669705, -1.52395492, -0.68237624,  0.28242954],

       [-0.35983191,  0.65950176, -0.61423896, -1.40462237],

       [ 0.61920896,  0.67665097, -0.47702115,  0.23167565],

       [ 0.32777344, -2.46573016, -1.10936753, -0.20069354]])

 

通过布尔型数组设置值是一种常用方法

data[data<0]=0

data[names!=‘Joe‘]=7

 

15、      花式索引:花式索引是指利用整数组进行索引

arr=np.empty((8,4))

for i in range(8):

arr[i]=i

 

为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可

arr[[4,3,0,6]]

Out[51]:

array([[ 4.,  4.,  4.,  4.],

       [ 3.,  3.,  3.,  3.],

       [ 0.,  0.,  0.,  0.],

       [ 6.,  6.,  6.,  6.]])

 

使用负数索引将会从末尾开始选取行

arr[[-3,-5,-7]]   

Out[52]:

array([[ 5.,  5.,  5.,  5.],

       [ 3.,  3.,  3.,  3.],

       [ 1.,  1.,  1.,  1.]])

 

一次传入多个索引组返回一个一维数组,其中的元素对应各个索引元组

arr=np.arange(32).reshape((8,4))

arr

Out[62]:

array([[ 0,  1,  2,  3],

       [ 4,  5,  6,  7],

       [ 8,  9, 10, 11],

       ...,

       [20, 21, 22, 23],

       [24, 25, 26, 27],

       [28, 29, 30, 31]])

 

arr[[1,5,7,2],[0,3,1,2]]  #最终选取的元素是(1,0),(5,3),(7,1),(2,2

Out[57]: array([ 4, 23, 29, 10])

arr[[1,5,7,2]][:,[0,3,1,2]]   #先选择第1/5/7/2行,再进行切片处理

Out[65]:

array([[ 4,  7,  5,  6],

       [20, 23, 21, 22],

       [28, 31, 29, 30],

       [ 8, 11,  9, 10]])

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

Out[66]:

array([[ 4,  7,  5,  6],

       [20, 23, 21, 22],

       [28, 31, 29, 30],

       [ 8, 11,  9, 10]])

 

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

一元(unaryufunc:只需输入一个数组,例如sqrtexp

arr=np.arange(10)

np.sqrt(arr)

Out[91]:

array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,

        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ])

np.exp(arr)

Out[92]:

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])

常用一元ufunc

absfabs:计算整数、浮点数、复数的绝对值,对于非复数可以使用更快的fabs

sqrt:计算各元素的平方根

square:计算各元素的平方

exp:计算各元素的指数幂

loglog10log2log1p:分别为自然对数、底数为10的log、底数为2的log、log(1+x)

sign:返回各元素的正负号:1(正数)、0(零)、-1(负数)

ceil返回大于等于各元素的最小整数

floor返回小于等于各元素的最大整数

rint:返回各元素四舍五入得到的整数,保留原dtype

modf:将数组的小数和整数部分以两个独立数组的形式返回

isnan:返回一个表示各元素是否为NaN的布尔型数组

isfiniteisinf:返回一个表示各元素是否为有穷或无穷的布尔型数组

logical_not:计算各元素not x的真值

 

二元(binaryufunc:需要输入两个数组,例如addmaximum

x=np.random.randn(8)

x

Out[95]:

array([-0.73665555, -1.08225703,  0.396678  ,  0.27265501,  0.20515391,

       -0.0077888 ,  0.65757567,  0.59417019])

y=np.random.randn(8)

y

Out[97]:

array([  1.67000867e-02,  -9.78981079e-01,  -5.10291947e-02,

        -1.25185821e+00,   1.60270406e-01,   1.73204017e+00,

        -6.71498427e-04,  -3.69454256e-01])

np.maximum(x,y)

Out[98]:

array([ 0.01670009, -0.97898108,  0.396678  ,  0.27265501,  0.20515391,

        1.73204017,  0.65757567,  0.59417019])

 

常用的二元ufunc

addsubtract:将数组中对应元素相加或相减

multiply:数组元素相乘

dividefloor_divide:除法或向下圆整除法(丢弃余数)

power:对第一个数组中的元素A,第二个数组中对应元素B,计算A的B次方

maximumfmax/minimunfmin:元素级的最大/小值运算,fmax/fmin将忽略NaN

mod:元素级的求模运算(即返回除法的余数)

copysign:将第二个数组中各元素的符号复制给第一个数组中的各元素

greatergreater_equal/lessless_equal/equalnot_equal:执行元素级的比较运算,返回一个布尔型数组,分别相当于>、>=、<、<=、==、!=

logical_andlogical_orlogical_xor:执行元素级的真值逻辑运算,分别相当于&、|、^

 

17、      关于np.where函数

arr=np.random.randn(4,4)

arr

Out[133]:

array([[-1.72563784,  0.32807733,  0.23763017, -1.35535678],

       [ 2.26811565, -1.16152395,  0.10114204,  0.14026815],

       [-1.75903744, -3.11583062, -2.26546412,  1.70422696],

       [-0.41677835,  0.34599268,  0.89238852, -0.52528288]])

 

np.where(arr>0,2,-2)

Out[134]:

array([[-2,  2,  2, -2],

       [ 2, -2,  2,  2],

       [-2, -2, -2,  2],

       [-2,  2,  2, -2]])

 

np.where(arr>0,2,arr)

Out[136]:

array([[-1.72563784,  2.        ,  2.        , -1.35535678],

       [ 2.        , -1.16152395,  2.        ,  2.        ],

       [-1.75903744, -3.11583062, -2.26546412,  2.        ],

       [-0.41677835,  2.        ,  2.        , -0.52528288]])

 

18、      用于布尔型数组的方法

在对数组进行summeanmin等运算时,布尔值会被强制转换为10,因此sum经常被用来对布尔型数组中的True值计数:

arr=np.random.randn(10)

arr

Out[148]:

array([-0.15863925,  0.45656155,  0.3049392 , -1.94173424,  0.3308966 ,

        0.96004094, -1.47326692, -0.25883203,  0.50200098,  0.46647641])

 

(arr>0).sum()

Out[149]: 6

 

any用于测试数组中是否存在一个或多个True,all则检查数组中所有值是否都是True:

bools=np.array([False,False,True,False])

 

bools.any()

Out[151]: True

 

bools.all()

Out[152]: False

 

19、      排序

arr=np.random.randn(5,3)

arr

Out[159]:

array([[  4.58258109e-01,   2.34139626e-01,   5.68535912e-01],

       [ -1.39700583e-03,   2.25698280e-01,  -1.37764403e-01],

       [  2.15419998e-01,   4.98692282e-01,  -7.79053967e-01],

       [ -8.64182544e-01,  -1.84197701e+00,  -5.48066394e-01],

       [  1.25435316e+00,  -3.22412013e-01,   6.84147453e-01]])

arr.sort(0)   #np.sort返回的是数组的已排序副本,而sort()会修改数组本身

arr

Out[170]:

array([[ -8.64182544e-01,  -1.84197701e+00,  -7.79053967e-01],

       [ -1.39700583e-03,  -3.22412013e-01,  -5.48066394e-01],

       [  2.15419998e-01,   2.25698280e-01,  -1.37764403e-01],

       [  4.58258109e-01,   2.34139626e-01,   5.68535912e-01],

       [  1.25435316e+00,   4.98692282e-01,   6.84147453e-01]])

arr.sort(1)

arr

Out[172]:

array([[ -1.84197701e+00,  -8.64182544e-01,  -7.79053967e-01],

       [ -5.48066394e-01,  -3.22412013e-01,  -1.39700583e-03],

       [ -1.37764403e-01,   2.15419998e-01,   2.25698280e-01],

       [  2.34139626e-01,   4.58258109e-01,   5.68535912e-01],

       [  4.98692282e-01,   6.84147453e-01,   1.25435316e+00]])

 

20、      唯一化以及其他的集合逻辑

names=np.array([‘Bob‘,‘Joe‘,‘Will‘,‘Bob‘,‘Joe‘])

np.unique(names)       #np.unique用于找出数组中的唯一值并返回已排序的结果

Out[199]:

array([‘Bob‘, ‘Joe‘, ‘Will‘],

      dtype=‘<U4‘)

np.array(list(set(names)))  #运用set稍微繁琐一些

Out[206]:

array([‘Bob‘, ‘Joe‘, ‘Will‘],

      dtype=‘<U4‘)

Numpy总结

标签:多维数组   logical   单位   列表   自动   元素   bin   import   序列   

原文地址:http://www.cnblogs.com/albertm/p/7499191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!