Python NumPy 的基本切片和高级索引
NumPy或Numeric Python是一个用于同构n维arrays计算的包。在numpy维度中称为轴。
为什么我们需要NumPy ?
一个问题出现了,当python列表已经存在时,为什么我们还需要NumPy。答案是我们不能直接对两个列表的所有元素进行操作。例如,我们不能将两个列表直接相乘,我们必须按元素进行乘法运算。这就是NumPy的作用发挥作用的地方。
# Python program to demonstrate a need of NumPy
list1 = [1, 2, 3, 4 ,5, 6]
list2 = [10, 9, 8, 7, 6, 5]
# Multiplying both lists directly would give an error.
print(list1*list2)
输出 :
TypeError: can't multiply sequence by non-int of type 'list'
这可以很容易地用NumPyarrays完成。
另外一个例子:
# Python program to demonstrate the use of NumPy arrays
import numpy as np
list1 = [1, 2, 3, 4, 5, 6]
list2 = [10, 9, 8, 7, 6, 5]
# Convert list1 into a NumPy array
a1 = np.array(list1)
# Convert list2 into a NumPy array
a2 = np.array(list2)
print(a1*a2)
输出 :
array([10, 18, 24, 28, 30, 30])
本文将帮助您详细了解NumPy中的索引。python的Numpy包具有强大的功能,可以通过不同的方式进行索引。
使用索引arrays进行索引
通过使用数组作为索引,可以在numpy中进行索引。对于切片,返回的是数组的视图或浅拷贝,而对于索引数组,返回的是原始数组的拷贝。Numpyarrays可以与其他arrays或除元组外的任何其他序列建立索引。最后一个元素的索引是-1,倒数是-2,依此类推。
# Python program to demonstrate
# the use of index arrays.
import numpy as np
# Create a sequence of integers from 10 to 1 with a step of -2
a = np.arrange(10, 1, -2)
print("\n A sequential array with a negative step: \n",a)
# Indexes are specified inside the np.array method.
newarr = a[np.array([3, 1, 2 ])]
print("\n Elements at these indices are:\n",newarr)
输出 :
A sequential array with a negative step:
[10 8 6 4 2]
Elements at these indices are:
[4 8 6]
另外一个例子:
import numpy as np
# NumPy array with elements from 1 to 9
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# Index values can be negative.
arr = x[np.array([1, 3, -3])]
print("\n Elements are : \n",arr)
输出 :
Elements are:
[2 4 7]
类型的索引
有两种索引类型:
1.基本切片和索引:考虑语法x[obj],其中x是数组,obj是索引。Slice对象是基本切片情况下的索引。当obj为:
- 形式为start: stop: step的切片对象
- 一个整数
- 或者是切片对象和整数的元组
所有由基本切片生成的arrays始终是原始数组的视图。
# Python program for basic slicing.
import numpy as np
# Arrange elements from 0 to 19
a = np.arrange(20)
print("\n Array is:\n ",a)
# a[start:stop:step]
print("\n a[-8:17:1] = ",a[-8:17:1])
# The : operator means all elements till the end.
print("\n a[10:] = ",a[10:])
输出 :
Array is:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
a[-8:17:1] = [12 13 14 15 16]
a[10:] = [10 11 12 13 14 15 16 17 18 19]
省略也可以与基本切片一起使用。Ellipsis(…)是创建与数组维数相同长度的选择元组所需的:对象的数量。
# Python program for indexing using basic slicing with ellipsis
import numpy as np
# A 3 dimensional array.
b = np.array([[[1, 2, 3],[4, 5, 6]],
[[7, 8, 9],[10, 11, 12]]])
print(b[...,1]) #Equivalent to b[: ,: ,1 ]
输出 :
[[ 2 5]
[ 8 11]]
2.高级索引:当obj为时触发高级索引:
- 整数或布尔类型的ndarray
- 或者至少包含一个序列对象的元组
- 是非元组序列对象吗
高级索引返回数据的副本,而不是数据的视图。高级索引有两种类型:整数型和布尔型。
纯整数索引:当整数用于索引时。第一个维度的每个元素都与第二个维度的元素配对。因此,在这种情况下,元素的索引是(0,0),(1,0),(2,1),并选择了相应的元素。
# Python program showing advanced indexing
import numpy as np
a = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]])
print(a[[0 ,1 ,2 ],[0 ,0 ,1]])
输出 :
[1 3 6]
Boolean Indexing
这个索引有一个布尔表达式作为索引。返回那些满足布尔表达式的元素。它用于筛选所需的元素值。
# You may wish to select numbers greater than 50
import numpy as np
a = np.array([10, 40, 80, 50, 100])
print(a[a>50])
输出 :
[80 100]
# You may wish to square the multiples of 40
import numpy as np
a = np.array([10, 40, 80, 50, 100])
print(a[a%40==0]**2)
输出 :
[1600 6400])
# You may wish to select those elements whose
# sum of row is a multiple of 10.
import numpy as np
b = np.array([[5, 5],[4, 5],[16, 4]])
sumrow = b.sum(-1)
print(b[sumrow%10==0])
输出 :
array([[ 5, 5], [16, 4]])