NumPy 1.26 中文官方指南(二)(1)https://developer.aliyun.com/article/1510605
如何获取唯一项和计数
本节包括 np.unique()
你可以通过np.unique
轻松找到数组中的唯一元素。
例如,如果你从这个数组开始:
>>> a = np.array([11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20])
你可以使用np.unique
来打印数组中的唯一值:
>>> unique_values = np.unique(a) >>> print(unique_values) [11 12 13 14 15 16 17 18 19 20]
要在 NumPy 数组中获取唯一值的索引(数组中唯一值的第一个索引位置数组),只需在np.unique()
中传递return_index
参数以及你的数组即可。
>>> unique_values, indices_list = np.unique(a, return_index=True) >>> print(indices_list) [ 0 2 3 4 5 6 7 12 13 14]
你可以在np.unique()
中传递return_counts
参数以及你的数组来获得 NumPy 数组中唯一值的频率计数。
>>> unique_values, occurrence_count = np.unique(a, return_counts=True) >>> print(occurrence_count) [3 2 2 2 1 1 1 1 1 1]
这也适用于 2D 数组!如果你从这个数组开始:
>>> a_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 4]])
你可以找到唯一值,np.unique()
可以帮你实现。
>>> unique_values = np.unique(a_2d) >>> print(unique_values) [ 1 2 3 4 5 6 7 8 9 10 11 12]
如果没有传递 axis 参数,你的 2D 数组将被展平。
如果想要获取唯一行或列,请确保传递axis
参数。要找到唯一行,请指定axis=0
,对于列,请指定axis=1
。
>>> unique_rows = np.unique(a_2d, axis=0) >>> print(unique_rows) [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]
要获取唯一行、索引位置和出现次数,可以使用:
>>> unique_rows, indices, occurrence_count = np.unique( ... a_2d, axis=0, return_counts=True, return_index=True) >>> print(unique_rows) [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] >>> print(indices) [0 1 2] >>> print(occurrence_count) [2 1 1]
想要了解如何在数组中查找唯一元素,请参见unique
。
转置和重塑矩阵
这一部分涵盖 arr.reshape()
, arr.transpose()
, arr.T
需要转置矩阵是很常见的。NumPy 数组具有允许您转置矩阵的属性T
。
当需要转置矩阵维度时,可能会发生这种情况。例如,当您有一个模型期望不同于数据集的特定输入形状时。在这种情况下,reshape
方法可以派上用场。您只需传入想要矩阵的新维度。
>>> data.reshape(2, 3) array([[1, 2, 3], [4, 5, 6]]) >>> data.reshape(3, 2) array([[1, 2], [3, 4], [5, 6]])
您也可以使用.transpose()
根据您指定的值反转或更改数组的轴。
如果从这个数组开始:
>>> arr = np.arange(6).reshape((2, 3)) >>> arr array([[0, 1, 2], [3, 4, 5]])
您可以使用arr.transpose()
来转置数组。
>>> arr.transpose() array([[0, 3], [1, 4], [2, 5]])
您还可以使用arr.T
:
>>> arr.T array([[0, 3], [1, 4], [2, 5]])
想要了解关于转置和重塑数组的更多信息,请参见transpose
和reshape
。
如何反转数组
这一部分涵盖 np.flip()
NumPy 的np.flip()
函数允许您沿轴翻转或反转数组的内容。使用np.flip()
时,请指定要反转的数组以及轴。如果不指定轴,NumPy 将沿着输入数组的所有轴反转内容。
反转 1D 数组
如果从这样一个 1D 数组开始:
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
您可以使用以下方法反转:
>>> reversed_arr = np.flip(arr)
如果想要打印您反转的数组,可以运行:
>>> print('Reversed Array: ', reversed_arr) Reversed Array: [8 7 6 5 4 3 2 1]
反转 2D 数组
2D 数组的操作方式基本相同。
如果从这个数组开始:
>>> arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
可以使用以下方法反转所有行和所有列中的内容:
>>> reversed_arr = np.flip(arr_2d) >>> print(reversed_arr) [[12 11 10 9] [ 8 7 6 5] [ 4 3 2 1]]
您可以轻松地仅反转行:
>>> reversed_arr_rows = np.flip(arr_2d, axis=0) >>> print(reversed_arr_rows) [[ 9 10 11 12] [ 5 6 7 8] [ 1 2 3 4]]
或仅反转列:
>>> reversed_arr_columns = np.flip(arr_2d, axis=1) >>> print(reversed_arr_columns) [[ 4 3 2 1] [ 8 7 6 5] [12 11 10 9]]
您还可以反转仅一个列或一行的内容。例如,您可以反转第 1 个索引位置的行中的内容(第二行):
>>> arr_2d[1] = np.flip(arr_2d[1]) >>> print(arr_2d) [[ 1 2 3 4] [ 8 7 6 5] [ 9 10 11 12]]
也可以反转第 1 个索引位置的列(第二列):
>>> arr_2d[:,1] = np.flip(arr_2d[:,1]) >>> print(arr_2d) [[ 1 10 3 4] [ 8 7 6 5] [ 9 2 11 12]]
了解更多关于反转数组的内容,请查看flip
。
重塑和扁平化多维数组
这一部分涵盖 .flatten()
, ravel()
有两种常用的展平数组的方法:.flatten()
和.ravel()
。两者之间的主要区别是使用ravel()
创建的新数组实际上是对父数组的引用(即“视图”)。这意味着对新数组的任何更改也会影响父数组。由于ravel
不创建副本,它在内存上是高效的。
如果你有这个数组:
>>> x = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
你可以使用flatten
将数组展平为一个一维数组。
>>> x.flatten() array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
当你使用flatten
时,对新数组的更改不会影响父数组。
例如:
>>> a1 = x.flatten() >>> a1[0] = 99 >>> print(x) # Original array [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] >>> print(a1) # New array [99 2 3 4 5 6 7 8 9 10 11 12]
但是当你使用ravel
时,你对新数组所做的更改将影响父数组。
例如:
>>> a2 = x.ravel() >>> a2[0] = 98 >>> print(x) # Original array [[98 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] >>> print(a2) # New array [98 2 3 4 5 6 7 8 9 10 11 12]
在ndarray.flatten
和ravel
中了解更多关于flatten
和ravel
的信息。
如何访问文档字符串以获取更多信息
本节介绍 help()
、?
、??
在数据科学生态系统方面,Python 和 NumPy 是为用户设计的。其中一个最好的例子就是内置访问文档的功能。每个对象都包含对一个字符串的引用,这个字符串被称为文档字符串。在大多数情况下,这个文档字符串包含对象和如何使用它的快速简明摘要。Python 有一个内置的help()
函数,可以帮助您访问这些信息。这意味着几乎任何时候您需要更多信息,都可以使用help()
快速找到您需要的信息。
例如:
>>> help(max) Help on built-in function max in module builtins: max(...) max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument.
因为额外信息的获取非常有用,IPython 使用?
字符作为访问此文档以及其他相关信息的简短方式。IPython 是用于多种语言的交互式计算的命令行。你可以在这里找到有关 IPython 的更多信息。
例如:
In [0]: max? max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument. Type: builtin_function_or_method
甚至可以对对象方法和对象本身使用这种表示法。
假设你创建了这个数组:
>>> a = np.array([1, 2, 3, 4, 5, 6])
然后你可以获得很多有用的信息(首先是关于a
本身的详细信息,然后是a
所属的ndarray
的文档字符串):
In [1]: a? Type: ndarray String form: [1 2 3 4 5 6] Length: 6 File: ~/anaconda3/lib/python3.9/site-packages/numpy/__init__.py Docstring: <no docstring> Class docstring: ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None) An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.) Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(...)`) for instantiating an array. For more information, refer to the `numpy` module and examine the methods and attributes of an array. Parameters ---------- (for the __new__ method; see Notes below) shape : tuple of ints Shape of created array. ...
对于你创建的函数和其他对象也适用这个方法。只需记住使用字符串字面值(用 """ """
或 ''' '''
将你的文档括起来)为你的函数添加文档字符串即可。
例如,如果你创建了这个函数:
>>> def double(a): ... '''Return a * 2''' ... return a * 2
你可以获取有关函数的信息:
In [2]: double? Signature: double(a) Docstring: Return a * 2 File: ~/Desktop/<ipython-input-23-b5adf20be596> Type: function
通过阅读你感兴趣的对象的源代码,可以获得更深入的信息。使用两个问号(??
)可以访问源代码。
例如:
In [3]: double?? Signature: double(a) Source: def double(a): '''Return a * 2''' return a * 2 File: ~/Desktop/<ipython-input-23-b5adf20be596> Type: function
如果问题中的对象是在 Python 以外的语言中编译的,使用??
将返回与?
相同的信息。例如,您会发现许多内置对象和类型都是如此:
In [4]: len? Signature: len(obj, /) Docstring: Return the number of items in a container. Type: builtin_function_or_method
和:
In [5]: len?? Signature: len(obj, /) Docstring: Return the number of items in a container. Type: builtin_function_or_method
有相同的输出,因为它们是在 Python 以外的编程语言中编译的。
处理数学公式
实现在数组上运行数学公式的简易性是让 NumPy 在科学 Python 社区中得到广泛应用的原因之一。
例如,这是均方误差公式(监督学习模型中常用于回归问题的中心公式):
在 NumPy 中实现此公式简单而直接:
这样做得很好的原因是 predictions
和 labels
可能包含一个或一千个值,它们只需要具有相同的大小。
您可以以这种方式可视化它:
在此示例中,预测和标签向量都包含三个值,这意味着 n
的值为三。在我们进行减法操作后,向量中的值被平方。然后 NumPy 对值求和,您的结果就是该预测的错误值和模型质量的得分。
如何保存和加载 NumPy 对象
本节涵盖 np.save
, np.savez
, np.savetxt
, np.load
, np.loadtxt
在某个时候,您可能想要将数组保存到磁盘并加载它们,而无需重新运行代码。幸运的是,有几种方法可以使用 NumPy 保存和加载对象。ndarray 对象可以使用loadtxt
和savetxt
函数保存到磁盘文件中,这些函数处理普通文本文件,使用处理 NumPy 二进制文件的load
和save
函数,具有 .npy 文件扩展名,并使用处理具有 .npz 文件扩展名的 NumPy 文件的savez
函数。
.npy 和 .npz 文件存储数据、形状、数据类型以及其他信息,以便在需重建数组的情况下以一种允许正确检索数组的方式。即使文件位于具有不同架构的另一台机器上,也能正确检索数组。
如果要存储单个 ndarray 对象,请使用np.save
将其存储为 .npy 文件。如果要在单个文件中存储多个 ndarray 对象,请使用np.savez
将其保存为 .npz 文件。您还可以使用savez_compressed
将多个数组保存到单个文件中以压缩的 npz 格式。
使用np.save()
轻松保存和加载数组。只需确保指定要保存的数组和文件名。例如,如果您创建此数组:
>>> a = np.array([1, 2, 3, 4, 5, 6])
你可以使用以下方式保存为“filename.npy”:
>>> np.save('filename', a)
您可以使用np.load()
重建您的数组。
>>> b = np.load('filename.npy')
如果你想检查你的数组,可以运行:
>>> print(b) [1 2 3 4 5 6]
您可以使用np.savetxt
将 NumPy 数组保存为普通文本文件,如 .csv 或 .txt 文件。
例如,如果您创建此数组:
>>> csv_arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
你可以像这样将其保存为名为“new_file.csv”的.csv 文件:
>>> np.savetxt('new_file.csv', csv_arr)
可以使用loadtxt()
快速和方便地加载保存的文本文件:
>>> np.loadtxt('new_file.csv') array([1., 2., 3., 4., 5., 6., 7., 8.])
savetxt()
和loadtxt()
函数还接受其他可选参数,如头部(header)、尾部(footer)和分隔符(delimiter)。虽然文本文件更容易共享,但.npy 和.npz 文件更小更快。如果需要更复杂的文本文件处理(例如,如果需要处理包含缺失值的行),则需要使用genfromtxt
函数。
使用savetxt
,你可以指定头部(headers)、尾部(footers)、注释等。
了解更多关于输入和输出例程的信息。
导入和导出 CSV 文件
读取包含现有信息的 CSV 非常简单。最好和最简单的方法是使用Pandas。
>>> import pandas as pd >>> # If all of your columns are the same type: >>> x = pd.read_csv('music.csv', header=0).values >>> print(x) [['Billie Holiday' 'Jazz' 1300000 27000000] ['Jimmie Hendrix' 'Rock' 2700000 70000000] ['Miles Davis' 'Jazz' 1500000 48000000] ['SIA' 'Pop' 2000000 74000000]] >>> # You can also simply select the columns you need: >>> x = pd.read_csv('music.csv', usecols=['Artist', 'Plays']).values >>> print(x) [['Billie Holiday' 27000000] ['Jimmie Hendrix' 70000000] ['Miles Davis' 48000000] ['SIA' 74000000]]
使用 Pandas 导出数组也很简单。如果对 NumPy 不熟悉,可以从数组的值中创建一个 Pandas 数据框,然后使用 Pandas 将数据框写入 CSV 文件。
如果创建了该数组“a”
>>> a = np.array([[-2.58289208, 0.43014843, -1.24082018, 1.59572603], ... [ 0.99027828, 1.17150989, 0.94125714, -0.14692469], ... [ 0.76989341, 0.81299683, -0.95068423, 0.11769564], ... [ 0.20484034, 0.34784527, 1.96979195, 0.51992837]])
你可以创建一个 Pandas 数据框
>>> df = pd.DataFrame(a) >>> print(df) 0 1 2 3 0 -2.582892 0.430148 -1.240820 1.595726 1 0.990278 1.171510 0.941257 -0.146925 2 0.769893 0.812997 -0.950684 0.117696 3 0.204840 0.347845 1.969792 0.519928
你可以轻松地保存你的 DataFrame:
>>> df.to_csv('pd.csv')
并使用以下方式读取 CSV 文件:
>>> data = pd.read_csv('pd.csv')
你还可以使用 NumPy 的savetxt
方法保存你的数组。
>>> np.savetxt('np.csv', a, fmt='%.2f', delimiter=',', header='1, 2, 3, 4')
如果在命令行中使用,可以使用类似以下的命令随时读取已保存的 CSV 文件:
$ cat np.csv # 1, 2, 3, 4 -2.58,0.43,-1.24,1.60 0.99,1.17,0.94,-0.15 0.77,0.81,-0.95,0.12 0.20,0.35,1.97,0.52
或者你可以随时用文本编辑器打开文件!
如果你对 Pandas 感兴趣,请查看官方 Pandas 文档。了解如何使用官方 Pandas 安装信息安装 Pandas。
使用 Matplotlib 绘制数组
如果需要为你的值生成一个图表,使用Matplotlib非常简单。
例如,你可能有一个像这样的数组:
>>> a = np.array([2, 1, 5, 7, 4, 6, 8, 14, 10, 9, 18, 20, 22])
如果已经安装了 Matplotlib,可以使用以下方式导入它:
>>> import matplotlib.pyplot as plt # If you're using Jupyter Notebook, you may also want to run the following # line of code to display your code in the notebook: %matplotlib inline
要绘制你的值,只需要运行:
>>> plt.plot(a) # If you are running from a command line, you may need to do this: # >>> plt.show()
例如,可以通过以下方式绘制 1D 数组:
>>> x = np.linspace(0, 5, 20) >>> y = np.linspace(0, 10, 20) >>> plt.plot(x, y, 'purple') # line >>> plt.plot(x, y, 'o') # dots
使用 Matplotlib,你有许多可视化选项。
>>> fig = plt.figure() >>> ax = fig.add_subplot(projection='3d') >>> X = np.arange(-5, 5, 0.15) >>> Y = np.arange(-5, 5, 0.15) >>> X, Y = np.meshgrid(X, Y) >>> R = np.sqrt(X**2 + Y**2) >>> Z = np.sin(R) >>> ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis')
要阅读更多关于 Matplotlib 及其功能的信息,请查看官方文档。有关安装 Matplotlib 的指示,请参阅官方的安装部分。
图片来源:Jay Alammar http://jalammar.github.io/
欢迎来到 NumPy!
NumPy(Numerical Python)是一个开源的 Python 库,几乎在科学和工程的每个领域中都有使用。它是 Python 中处理数值数据的通用标准,是科学 Python 和 PyData 生态系统的核心。NumPy 的用户包括从初学者到进行尖端科学和工业研究与开发的经验丰富的研究人员。NumPy API 在 Pandas、SciPy、Matplotlib、scikit-learn、scikit-image 和大多数其他数据科学和科学 Python 包中广泛使用。
NumPy 库包含多维数组和矩阵数据结构(你将在后面的部分中找到更多信息)。它提供了ndarray,一个同构的 n 维数组对象,并提供了方法来高效地对其进行操作。NumPy 可以用于对数组执行各种各样的数学操作。它向 Python 添加了强大的数据结构,保证了对数组和矩阵的高效计算,并提供了大量的高级数学函数库,可以操作这些数组和矩阵。
在这里了解更多关于 NumPy 的信息!
安装 NumPy
要安装 NumPy,我们强烈建议使用科学 Python 发行版。如果你正在寻找有关在你的操作系统上安装 NumPy 的完整说明,请参阅安装 NumPy。
如果你已经安装了 Python,你可以使用以下命令安装 NumPy:
conda install numpy
或者
pip install numpy
如果你还没有安装 Python,你可能想考虑使用Anaconda。这是最简单的入门方式。使用这个发行版的好处是你不需要过多地担心单独安装 NumPy 或者你将用于数据分析的任何主要包,如 pandas、Scikit-Learn 等。
如何导入 NumPy
要访问 NumPy 及其函数,请在你的 Python 代码中像这样导入它:
import numpy as np
我们将导入的名称缩短为np
,以提高使用 NumPy 的代码的可读性。这是一种被广泛采用的惯例,使得你的代码对所有工作在其中的人更易读。我们建议始终使用import numpy as np
导入。
NumPy 1.26 中文官方指南(二)(3)https://developer.aliyun.com/article/1510608