(100天2小时第十七天)索引

我们前面学过了numpy普通的python方式的索引和切片,现在学习整数数组或布尔数组索引。

一、数组索引

a = np.arange(12) ** 2
print(a)
i = np.array([1,1,3,8,5])
print(i)
print(a[i])# 返回a中再索引i的元素
j = np.array([[3, 4], [9, 7]])
print(j)
[  0   1   4   9  16  25  36  49  64  81 100 121]
[1 1 3 8 5]
[ 1  1  9 64 25]
[[3 4]
 [9 7]]

1.当数组索引作用在多维数组时,是根据数组的第一个维度来索引的。

palette = np.array([ [0 ,0, 0],
                     [255, 0, 0],
                     [0, 255, 0],
                     [0, 0, 255],
                     [255, 255, 255] ])
image = np.array([ [0, 1, 2, 0],#输出行下标为0,1,2,0的数
                   [0, 3, 4, 0] ])
print( palette[image])
[[[  0   0   0]
  [255   0   0]
  [  0 255   0]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0 255]
  [255 255 255]
  [  0   0   0]]]

2.索引同样可以是多维的,但是必须是相同的shape。

a = np.arange(12).reshape(3, 4)
print(a)
print('\n')
i = np.array([[0,1],
              [1,2] ])

j = np.array([[2, 1],
               [3, 3] ])
#i和j必须有相同的维度
print(a[i, j])#i和j对应,输出0行2列对应2
print('\n')
print(a[i, 2])
print('\n')
print( a[:, j])
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]


[[ 2  5]
 [ 7 11]]


[[ 2  6]
 [ 6 10]]


[[[ 2  1]
  [ 3  3]]

 [[ 6  5]
  [ 7  7]]

 [[10  9]
  [11 11]]]

我们可以把ij放在一个列表里,然后用列表做索引

l = [i, j]
print(a[l])
[[ 2  5]
 [ 7 11]]

但是,我们不可以把ij放在一个数组里,因为数组索引是作用在第一个维度上的。

s = np.array([i, j])#创建数组
print(s)
print(a[s])
[[[0 1]
  [1 2]]

 [[2 1]
  [3 3]]]
C:/Users/Admin/PycharmProjects/untitled2/17.py:44: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  print(a[l])
Traceback (most recent call last):
  File "C:/Users/Admin/PycharmProjects/untitled2/17.py", line 48, in <module>
    print(a[s])
IndexError: index 3 is out of bounds for axis 0 with size 3
print(a[tuple(s)])#等价于 a[i, j]
[[2 1]
  [3 3]]]
[[ 2  5]
 [ 7 11]]

3.我们同样可以给数组索引赋值。

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

但是当列表包含相同的索引时,这个位置会被赋值多次,最终只保留最后一次的值。

a = np.arange(5)
print(a)
a[[0, 0, 2]] = [1, 2, 3]#0位置复制2次,只保留最后一次的值
print(a)
[0 1 2 3 4]
[2 1 3 3 4]
a = np.arange(5)
print(a)
a[[0, 0, 2]] = [1, 2, 3]#0位置复制2次,只保留最后一次的值
print(a)
a[[0, 0, 2]] += 1#第0个元素只加一次
print(a)
[0 1 2 3 4]
[2 1 3 3 4]
[3 1 4 3 4]

二、布尔数组索引

1.当使用数字数组索引时,我们提供了哪些元素要被索引的信息。但是当使用布尔数组时,我们是明确哪些元素需要,哪些元素不需要。

import numpy as np
a = np.arange(12).reshape((3,4))
print(a)
b = a > 4
print(b)
print(a[b])
a[b] = 0#这个特性非常适合用来赋值
print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]
[ 5  6  7  8  9 10 11]
[[0 1 2 3]
 [4 0 0 0]
 [0 0 0 0]]

例子1:使用布尔数组索引的例子曼德博集合。

另一个布尔数组的场景跟数字数组索引类似,对每个维度,我们提供一个1维的数组来选择我们需要的切片

a = np.arange(12).reshape(3, 4)
print(a)
print('\n')
b1 = np.array([False, True, True])
b2 = np.array([True, False, True, False])
print(a[b1, :])#行
print(a[b1])#同上一个结果相同
print('\n')
print(a[:, b2])#列
print('\n')
print(a[b1, b2])
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]


[[ 4  5  6  7]
 [ 8  9 10 11]]
[[ 4  5  6  7]
 [ 8  9 10 11]]


[[ 0  2]
 [ 4  6]
 [ 8 10]]


[ 4 10]

三、字符串索引

Numpy提供了创建结构化的数组的能力,可以通过列名来操作数据。

x = np.array([(1, 2., 'Hello'), (2, 3., "World")], dtype=[('foo', 'i4'), ('bar', 'f4'), ('baz', 'S10')])
print(x[1])
print(x['foo'])
print(x['bar'])
print(x['baz'])
(2, 3., b'World')
[1 2]
[2. 3.]
[b'Hello' b'World']

总结:

1.索引:数组索引、布尔型索引、字符串索引

2.索引可以是多维的,但是必须是相同的shape

3.我们可以把ij两个数组放在一个列表里,然后用列表做索引。但是,我们不可以把ij数组放在一个数组里,因为数组索引是作用在第一个维度上的。

4.我们可以给数组索引赋值,但是当列表包含相同的索引时,这个位置会被赋值多次,最终只保留最后一次的值。

   a[[0, 0, 2]] += 1#第0个元素只加一次。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值