import numpy as np
np.__version__
'1.22.4'
arr_rand = np.array([8, 8, 3, 7, 7, 0, 4, 2, 5, 2])
查找数组中值大于 4 的元素的索引。
idx_gt4 = np.where(arr_rand > 4)
idx_gt4
(array([0, 1, 3, 4, 8]),)
根据索引获取符合条件的数组元素。
arr_rand.take(idx_gt4)
array([[8, 8, 7, 7, 5]])
获取数组中最大值和最小值的索引及值。
print(f"最小值索引:{np.argmin(arr_rand)}, 最小值:{np.min(arr_rand)}")
print(f"最大值索引:{np.argmax(arr_rand)}, 最大值:{np.max(arr_rand)}")
最小值索引:5, 最小值:0 最大值索引:0, 最大值:8
# 关闭数字的科学表示法
np.set_printoptions(suppress=True)
path = "https://raw.githubusercontent.com/selva86/datasets/master/Auto.csv"
导入数据的标准方法是使用 np.genfromtxt
函数,它可以从 web URLs 导入数据,处理缺失值,支持多种分隔符,以及处理不规则的列数等功能。
delimiter
指定分隔符skip_header
指定从哪一行开始读取数据 (以 0 开始计数)filling_values
表示缺失值dtype
为 ‘object’ 时能同时处理具有数字和文本列的数据集data = np.genfromtxt(path, delimiter=",", skip_header=1, filling_values=-999)
data.shape
(392, 9)
data[:3]
array([[ 18. , 8. , 307. , 130. , 3504. , 12. , 70. , 1. , -999. ], [ 15. , 8. , 350. , 165. , 3693. , 11.5, 70. , 1. , -999. ], [ 18. , 8. , 318. , 150. , 3436. , 11. , 70. , 1. , -999. ]])
最后,np.savetxt
将数据保存为 CSV 文件。
np.savetxt("out.csv", data, delimiter=",")
Numpy 提供了 .npy
和 .npz
两种文件格式来存储数据。若要保存单个 ndarray 数据,可以使用 np.save 函数保存为 .npy
文件;若要保存多个 ndarray 数据,则可以使用 np.savez 函数保存为 .npz
文件。加载 numpy 数据时,统一使用 np.load 函数。
np.save("arr_rand.npy", arr_rand)
a = np.load("arr_rand.npy")
a
array([8, 8, 3, 7, 7, 0, 4, 2, 5, 2])
np.savez("arr.npz", arr_rand, data)
b = np.load("arr.npz")
b.files
['arr_0', 'arr_1']
b["arr_1"][:3]
array([[ 18. , 8. , 307. , 130. , 3504. , 12. , 70. , 1. , -999. ], [ 15. , 8. , 350. , 165. , 3693. , 11.5, 70. , 1. , -999. ], [ 18. , 8. , 318. , 150. , 3436. , 11. , 70. , 1. , -999. ]])
a = np.zeros([2, 3], dtype=np.int32)
a
array([[0, 0, 0], [0, 0, 0]], dtype=int32)
b = np.ones([2, 3], dtype=np.int32)
b
array([[1, 1, 1], [1, 1, 1]], dtype=int32)
按行拼接,将多个数组在垂直方向上 (即行的方向) 合并成一个新的数组。
np.vstack([a, b])
array([[0, 0, 0], [0, 0, 0], [1, 1, 1], [1, 1, 1]], dtype=int32)
np.concatenate([a, b], axis=0)
array([[0, 0, 0], [0, 0, 0], [1, 1, 1], [1, 1, 1]], dtype=int32)
按列拼接,将多个数组在水平方向上 (列的方向) 进行连接。
np.hstack([a, b])
array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 1]], dtype=int32)
np.concatenate([a, b], axis=1)
array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 1]], dtype=int32)
arr = np.random.randint(1, 6, size=[4, 3])
arr
array([[4, 4, 3], [1, 2, 4], [2, 5, 3], [2, 5, 1]])
np.sort
排序函数认为所有列是相互独立的,对所有列进行排序,破坏了每行的结构。使用 np.argsort
函数对第一列进行排序,返回索引,再根据第一列的索引对数组排序,保留了行的完整性。
sorted_index_1 = arr[:, 0].argsort()
arr[sorted_index_1]
array([[1, 2, 4], [2, 5, 3], [2, 5, 1], [4, 4, 3]])
arr[sorted_index_1[::-1]] # 降序倒排
array([[4, 4, 3], [2, 5, 1], [2, 5, 3], [1, 2, 4]])
若要基于多个列对数组进行排序,可以使用 np.lexsort
函数,其参数为元组类型,元组中的每个元素代表数组的某一列。排序规则是:越靠右的列,优先级越高。
sorted_index_1_and_2 = np.lexsort((arr[:, 1], arr[:, 0]))
arr[sorted_index_1_and_2]
array([[1, 2, 4], [2, 5, 3], [2, 5, 1], [4, 4, 3]])
x = np.arange(5)
x_col = np.expand_dims(x, axis=-1)
x_col
array([[0], [1], [2], [3], [4]])
x_col.shape
(5, 1)
x_row = np.expand_dims(x, axis=0)
x_row
array([[0, 1, 2, 3, 4]])
x_row.shape
(1, 5)
# 按列操作,查找每列的最大值
np.apply_along_axis(np.max, 0, arr=arr)
array([4, 5, 4])
# 按行操作,查找每行的最大值
np.apply_along_axis(np.max, 1, arr=arr)
array([4, 4, 5, 5])