python数组索引和切片_numpy数组的索引和切片

numpy数组的索引和切片

基本切片操作

>>> import numpy as np

>>> arr=np.arange(10)

>>> arr

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

>>> arr[5]

5

>>> arr[5:8]

array([5, 6, 7])

切片赋值操作

1.切片赋一个值对应原来数组中的值也会变

>>> arr[5:8]=12

>>> arr

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

>>> import numpy as np

>>> arr=np.arange(10)

>>> arr_slice=arr[5:8]

>>> arr_slice[0]=-1

>>> arr_slice

array([-1, 6, 7])

>>> arr

array([ 0, 1, 2, 3, 4, -1, 6, 7, 8, 9])

2.给数组中所有元素赋值

>>> arr[:]=-1

>>> arr

array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

3.如果想使用复制的方法,使用copy方法

>>> arr_copy=arr[:].copy()

>>> arr_copy

array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

>>> arr_copy[:]=0

>>> arr_copy

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

>>> arr

array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

高阶数组索引

>>> import numpy as np

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

>>> arr2d[2]

array([7, 8, 9])

>>> arr2d[0][2]

3

>>> arr2d[0,2]

3

>>> import numpy as np

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

>>> arr2d[2]

array([7, 8, 9])

>>> arr2d[0][2]

3

>>> arr2d[0,2]

3

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

>>> arr3d

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

[ 4, 5, 6]],

[[ 7, 8, 9],

[10, 11, 12]]])

>>> arr3d[0]

array([[1, 2, 3],

[4, 5, 6]])

>>> old_values=arr3d[0].copy()

>>> arr3d[0]=42

>>> arr3d

array([[[42, 42, 42],

[42, 42, 42]],

[[ 7, 8, 9],

[10, 11, 12]]])

>>> arr3d[1,0]

array([7, 8, 9])

>>> x=arr3d[1]

>>> x

array([[ 7, 8, 9],

[10, 11, 12]])

>>> x[0]

array([7, 8, 9])

高维数组切片

>>> arr2d[:2]

array([[1, 2, 3],

[4, 5, 6]])

>>> arr2d[:2,1:]

array([[2, 3],

[5, 6]])

>>> arr2d[1,:2]

array([4, 5])

>>> arr2d[:2,2]

array([3, 6])

>>> arr2d[:,:1]

array([[1],

[4],

[7]])

布尔型索引

1.假设我们有一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)。在这里,我将使用numpy.random中的randn函数生成一些正态分布的随机数据:

>>> import numpy as np

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

>>> data=np.random.randn(7,4)#7行4列正太分布随机数组

>>> names

array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='

>>> data

array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],

[-0.98602372, -0.69305692, -1.44431904, -0.85490816],

[-0.73613349, 0.12700976, -1.00588979, 1.10646269],

[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],

[-1.05607115, -0.50354292, -0.65820553, -0.77610316],

[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],

[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

2.假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行。跟算术运算一样,数组的比较运算(如==)也是矢量化的。因此,对names和字符串"Bob"的比较运算将会产生一个布尔型数组:

>>> names=='Bob'

array([ True, False, False, True, False, False, False])

3.布尔数组可以用于数组的索引

获取等于'Bob'的行

>>> data[names=='Bob']

array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],

[ 1.59110894, 1.68597758, 0.39414277, 2.02308399]])

获取不同于'Bob'的行

>>> data[names!='Bob']

array([[-0.98602372, -0.69305692, -1.44431904, -0.85490816],

[-0.73613349, 0.12700976, -1.00588979, 1.10646269],

[-1.05607115, -0.50354292, -0.65820553, -0.77610316],

[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],

[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

4.对布尔索引进行列索引

>>> data[names=='Bob',2:]

array([[-0.82061782, -0.65745818],

[ 0.39414277, 2.02308399]])

>>> data[names=='Bob',3]

array([-0.65745818, 2.02308399])

5.反转条件符

>>> cond=names=='Will'

>>> cond

array([False, False, True, False, True, False, False])

>>> data[~cond]

array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],

[-0.98602372, -0.69305692, -1.44431904, -0.85490816],

[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],

[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],

[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

6.布尔条件的运算

除此之外,连接符还有|、&之类

>>> mask=(names=='Bob')|(names=='Will')

>>> mask

array([ True, False, True, True, True, False, False])

>>> data[mask]

array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],

[-0.73613349, 0.12700976, -1.00588979, 1.10646269],

[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],

[-1.05607115, -0.50354292, -0.65820553, -0.77610316]])

7.条件选取

普通条件选取

>>> data[data<0]=0

>>> data

array([[0.24724057, 2.86939948, 0. , 0. ],

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

[0. , 0.12700976, 0. , 1.10646269],

[1.59110894, 1.68597758, 0.39414277, 2.02308399],

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

[1.72237936, 0. , 1.63462647, 0. ],

[0.66744687, 0. , 0. , 0.19080575]])

布尔条件选取

>>> import numpy as np

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

>>> data=np.random.randn(7,4)#7行4列正太分布随机数组

>>> data

array([[-1.24077681, -0.48320904, 1.22145611, 0.00666619],

[-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],

[-1.51669752, 2.04245014, 0.09453898, -0.85531867],

[-1.51334497, 0.36947066, -0.87016919, 1.35107873],

[-1.11285867, -2.20906849, 0.38269412, 1.85375798],

[ 0.95132554, -1.54193589, 1.98741745, -0.60608077],

[ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])

>>> data[names!='Joe']=7

>>> data

array([[ 7. , 7. , 7. , 7. ],

[-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],

[ 7. , 7. , 7. , 7. ],

[ 7. , 7. , 7. , 7. ],

[ 7. , 7. , 7. , 7. ],

[ 0.95132554, -1.54193589, 1.98741745, -0.60608077],

[ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])

>>>

花式索引

1.传入单个索引数组

>>> import numpy as np

>>> arr=np.empty((8,4))#创建8行4列内容为随机值的数组

>>> arr

array([[2.65577744e-260, 7.70858946e+218, 6.01334668e-154,

4.47593816e-091],

[7.01413727e-009, 2.96905203e+222, 2.11672643e+214,

4.56532297e-085],

[4.78409596e+180, 2.44001263e-152, 2.45981714e-154,

6.83528875e+212],

[6.14829725e-071, 1.05161522e-153, 1.05135742e-153,

2.43902457e-154],

[4.83245960e+276, 6.03103052e-154, 7.06652000e-096,

2.65862875e-260],

[1.76380220e+241, 2.30576063e-310, 9.80013217e+040,

1.55850644e-312],

[1.33360318e+241, 4.09842267e-310, 2.48721655e-075,

1.04922745e-312],

[1.91217285e-309, 1.18182126e-125, 6.57144273e-299,

5.54240979e-302]])

>>> for i in range(8):

arr[i]=i

>>> arr

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

>>> arr[[4,3,0,6]]#选特定的索引下标,选取第4,3,0,6行

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

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

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

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

>>> arr[[-3,-5,-7]]#选择特定的索引下标,选取第-3,-5,-7列

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

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

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

2.传入多个索引数组

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

>>> arr

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

[ 4, 5, 6, 7],

[ 8, 9, 10, 11],

[12, 13, 14, 15],

[16, 17, 18, 19],

[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)对应元素

array([ 4, 23, 29, 10])

>>> arr[[1,5,7,2]][:,[0,3,1,2]]#先选取第1,5,7,2行,再将每行按照0,3,1,2这个顺序交换

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

[20, 23, 21, 22],

[28, 31, 29, 30],

[ 8, 11, 9, 10]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值