优点:numpy代码比等价的python代码快得多
1、Numpy的数组剪切
从第二个元素开始,对从索引 1 到索引 4(不包括)的元素进行切片:
import numpy as np
arr = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
print(arr[1, 1:4])
结果:[7 8 9]
import numpy as np
arr = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
print(arr[0:2, 1:4])
结果:[[2 3 4]
[7 8 9]]
返回数组中相隔的元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
print(arr[::2])
结果:[1 3 5 7]
2、副本和视图之间的区别
副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。
副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。深拷贝的都是副本
视图不拥有数据,对视图所做的任何更改都会影响原始数组,而对原始数组所做的任何更改都会影响视图。
numpy的切片操作返回的是视图;或者array.view()
3、检查数组是否拥有数据
如上所述,副本拥有数据,而视图不拥有数据
每个 NumPy 数组都有一个属性 base,如果该数组拥有数据,则这个 base 属性返回 None。
4、数组重塑,reshape
注意: 重塑所需的元素在两种形状中均相等
重塑为4维数组,每个维度有3个元素
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
print(newarr)
#最外面的维度将具有 2 个数组,其中包含 3 个数组,每个数组包含 2 个元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(2, 3, 2)
print(newarr)
未知的维
不必在 reshape 方法中为维度之一指定确切的数字。
传递 -1 作为值,NumPy 将为自动计算该数字。
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
newarr = arr.reshape(2, 2, -1)
print(newarr)
结果:[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
展平数组
展平数组(Flattening the arrays)是指将多维数组转换为 1D 数组。使用 reshape(-1)
import numpy as np
arr = np.array([[1, 2, 3], [1, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)
结果:[1 2 3 1 5 6]
5、nditer() 迭代数组
import numpy as np
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
for x in np.nditer(arr):
print(x)
结果:
1
2
3
4
5
6
7
8
6、连接数组
沿行堆叠
hstack() 沿行堆叠。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.hstack((arr1, arr2))
print(arr)
# [1 2 3 4 5 6]
沿列堆叠
vstack() 沿列堆叠。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.vstack((arr1, arr2))
print(arr)
结果:[[1 2 3]
[4 5 6]]
沿高度堆叠(深度)
dstack() 沿高度堆叠,该高度与深度相同。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.dstack((arr1, arr2))
print(arr)
结果:[[[1 4]
[2 5]
[3 6]]]
7、拆分数组
将数组分为 3 个:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr)
结果:
[array([1, 2]), array([3, 4]), array([5, 6])]
如果数组中的元素少于要求的数量,它将从末尾进行相应调整。如:
将数组分为 4 部分:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 4)
print(newarr)
结果:
[array([1, 2]), array([3, 4]), array([5]), array([6])]
8、搜索数组
使用 where() 方法,where返回的是下标
np.where(condition[, x, y]):满足condition选择x中元素,否则选择y中元素。
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 4, 4])
x = np.where(arr == 4)
print(x)
#(array([3, 5, 6], dtype=int64),)
9、数组排序
import numpy as np
arr = np.array([[3, 2, 4], [5, 0, 1]])
print(np.sort(arr))
结果:
[[2 3 4]
[0 1 5]]
10、数组过滤
从现有数组中取出一些元素并从中创建新数组称为过滤(filtering)。
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
x = [True, False, True, False, True]
newarr = arr[x]
print(newarr)
结果:[61, 63, 65]
直接从数组创建过滤器
上例是 NumPy 中非常常见的任务,NumPy 提供了解决该问题的好方法。
创建一个仅返回大于 62 的值的过滤器数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
filter_arr = arr > 62
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
#[False False True True True]
#[63 64 65]