Numpy 奇怪索引方式

Numpy 奇怪索引方式

Numpy是Python中一个十分重要的用于数值计算的库,它提供了大量简便的操作方法,但是有些操作方式与其他Python库略有不同,给初学者带来了一点困扰。下面介绍一些与Numpy奇怪索引相关的问题。

阅读更多:Numpy 教程

布尔索引

在对Numpy数组进行索引时,我们可以使用布尔数组进行索引遮掩(boolean array indexing)。例如:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
mask = np.array([True, False, True, False, True])
print(arr[mask])
Python

输出结果为:

[1 3 5]
Python

在这个例子中,我们通过创建一个长度与数组arr相同的布尔掩码来选取数组中的元素。此处,掩码mask中为True的位置对应arr中同样位置的元素会被选出。掩码mask也可以由某些条件得到,例如:

mask = arr > 3
Python

这样我们就可以通过掩码mask来选取outout中的元素了。布尔索引既可以用于选取单个数组中的元素,也可以用于选取多个数组中的元素。例如:

import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])
mask = np.array([True, False, True, False, True])
print(arr1[mask])
print(arr2[mask])
Python

输出结果为:

[1 3 5]
[10 30 50]
Python

在这个例子中,我们首先通过掩码mask来选取两个数组中elementwise对应位置上的元素,再分别对每个数组进行操作。

整数索引

与布尔索引类似,整数索引也可以用于选取数组中对应位置的元素。相比之下,整数索引可以用于同时选取多个元素,或者选取某些从数组结构上不能由其他方法访问到的元素。例如:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
indices = np.array([1, 3])
print(arr[indices])
Python

输出结果为:

[2 4]
Python

在这个例子中,数组indices包含整数1和3,这样就可以根据他们在数组arr中的位置来选取所对应的两个元素。另外,需要注意的是,整数索引会生成一个新的数组,因此对选取结果进行修改并不会影响到原来的数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
indices = np.array([1, 3])
subset = arr[indices]
subset[0] = 10000
print(subset)
print(arr)
Python

输出结果为:

[10000     4]
[1 2 3 4 5]
Python

在这个例子中,我们对通过整数索引选取的子数组subset进行了修改,但是并没有修改原来的数组arr。

花式索引

花式索引是指通过列表或者数组进行索引的方法,在Numpy中这种方法也叫作“数组索引”、“非元素数组索引”或“整数数组索引”。相比之下,花式索引与上面介绍的其他索引方式不同,因为它所选取的元素不是基于某些掩码或者整数的位置,而是基于某些索引列表或者数组的内容。例如:

import numpy as np

arr = np.array(['apple', 'banana', 'cat', 'dog'])
indices = [0, 2, 3]
print(arr[indices])
Python

输出结果为:

['apple' 'cat' 'dog']
Python

在这个例子中,我们通过一个包含三个整数的列表来选取数组arr中对应位置的元素。另外,花式索引和其他索引方式相比有以下几个不同之处:

  1. 花式索引可以用于选取多个数组中的元素,例如:
import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])
indices = np.array([0, 2, 3])
print(arr1[indices])
print(arr2[indices])
Python

输出结果为:

[1 3 4]
[10 30 40]
Python
  1. 花式索引可以用于同时选取多个元素,例如:
import numpy as np

arr = np.array([['apple', 'banana', 'cat', 'dog'], ['elephant', 'frog', 'giraffe', 'horse']])
row_indices = np.array([0, 1])
col_indices = np.array([1, 3])
print(arr[row_indices, col_indices])
Python

输出结果为:

['banana' 'horse']
Python

在这个例子中,我们通过两个列表row_indices和col_indices分别指定所选取元素的行和列,将两个列表分别放在数组索引中,并使用逗号将它们分隔开来。

  1. 花式索引返回的是一个新的数组,因此对选取结果的修改并不会影响到原来的数组,例如:
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
indices = np.array([1, 3])
subset = arr[indices]
subset[0] = 10000
print(subset)
print(arr)
Python

输出结果为:

[10000     4]
[1 2 3 4 5]
Python

多维索引

在Numpy中,除了通过上面所介绍的掩码、整数、花式索引进行一维数组的索引,我们还可以通过它们的组合来进行多维数组的索引。例如:

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])
mask = np.array([True, False, True])
indices = np.array([0, 1])
print(arr[mask, indices])
Python

输出结果为:

[1 4]
Python

在这个例子中,我们通过掩码和整数索引的组合来选取二维数组arr中的元素,其中掩码mask所选择的是第1和第3行,而整数索引indices所选择的则是第1列和第2列。因此,选取的元素分别是arr[0, 1]和arr[2, 1]。

除了可以使用多个整数或者掩码,我们还可以使用多维的几个数组来进行索引,例如:

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])
mask = np.array([[True, False], [False, True], [True, False]])
indices = np.array([[0, 1], [1, 0], [0, 1]])
print(arr[mask, indices])
Python

输出结果为:

[1 4 6]
Python

在这个例子中,我们使用了两个二维数组来进行索引,其中掩码mask和整数索引indices所选取的元素分别是[1, 0], [2, 1], 和[1, 1],对应的在数组arr中的元素是1, 4, 和6。

数组转置和索引

在Numpy中,有些奇怪的索引方式还与数组的转置有关。数组转置可以通过将数组的行和列的顺序交换来得到,例如:

import numpy as np

arr = np.array([[1, 2], [3, 4], [5,6]])
print(arr)
print(arr.T)
Python

输出结果为:

[[1 2]
 [3 4]
 [5 6]]
[[1 3 5]
 [2 4 6]]
Python

在这个例子中,我们通过将arr的行和列的顺序互换来得到转置矩阵,由于数组是二维的,所以转置矩阵也是二维的。另外,需要注意的是,不同维度的数组转置方式略有不同,例如三维数组的转置:

import numpy as np

arr = np.arange(24).reshape((4, 3, 2))
print(arr)
print(arr.transpose((1, 0, 2)))
Python

输出结果为:

[[[ 0  1]
  [ 2  3]
  [ 4  5]]

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

 [[12 13]
  [14 15]
  [16 17]]

 [[18 19]
  [20 21]
  [22 23]]]
[[[ 0  1]
  [ 6  7]
  [12 13]
  [18 19]]

 [[ 2  3]
  [ 8  9]
  [14 15]
  [20 21]]

 [[ 4  5]
  [10 11]
  [16 17]
  [22 23]]]
Python

在这里,我们通过传入一个由元组表示的轴顺序来对数组进行转置,例如(1, 0, 2)表示将第1个轴和第0个轴交换位置,然后保持第2个轴不变。

另外,需要注意的是,转置矩阵同样可以通过索引进行操作。例如:

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])
transpose = arr.T
indices = [1, 0]
print(transpose[indices])
Python

输出结果为:

[[2 4 6]
 [1 3 5]]
Python

在这个例子中,我们通过转置矩阵transpose的索引来对其进行操作,例如[1, 0]表示获取transpose的第2列和第1列,并将其置于新的转置矩阵的第1行和第0行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册