1. 从零开始:认识NumPy与数组的诞生
如果你刚开始用Python处理数据,尤其是数字计算,那你迟早会撞上NumPy。我刚开始学的时候,总觉得列表(list)就够用了,直到有一次要处理一个几千行的数据表做矩阵运算,那个速度慢得让我怀疑人生。后来朋友甩给我一句:“用NumPy啊,快得飞起。” 我试了试,从此就离不开了。
NumPy到底是什么?你可以把它想象成一个超级计算器,但它不是算一个数,而是能同时处理成千上万个数的“数组”。这个数组,在NumPy里叫 ndarray,是它的核心。它和Python自带的列表最大的区别在于:列表里可以放数字、字符串、甚至另一个列表,五花八门;但ndarray要求里面的所有元素必须是同一种类型,比如全是整数,或者全是浮点数。这个设计听起来好像限制多了,但正是这个“限制”,让计算机处理起来效率极高,因为它知道内存里存的都是同规格的东西,可以一股脑儿并行计算。
怎么把它请到你的电脑里呢?很简单,打开你的命令行(终端),输入下面这行命令,回车就行:
pip install numpy
安装好后,在你的Python代码里,几乎所有人都会用 import numpy as np 来引入它。这个 np 是个约定俗成的别名,写起来短,用起来方便。
光说不练假把式,咱们直接上手创建一个数组看看。最常用的方法是用 np.array(),把Python的列表或元组扔进去,它就给你变出一个ndarray。
import numpy as np
# 从一个列表创建数组
my_list = [1, 2, 3, 4, 5]
arr_from_list = np.array(my_list)
print("从列表创建的数组:", arr_from_list)
# 输出:从列表创建的数组: [1 2 3 4 5]
# 从一个元组创建数组,并指定数据类型为浮点数
my_tuple = (1.5, 2.8, 3.1)
arr_from_tuple = np.array(my_tuple, dtype=float)
print("从元组创建的浮点数组:", arr_from_tuple)
# 输出:从元组创建的浮点数组: [1.5 2.8 3.1]
你可能注意到了,打印出来的数组没有逗号,这是NumPy数组的显示特点。创建数组时,有两个参数特别有用:ndmin 和 dtype。ndmin 可以强行指定数组的维度,哪怕你给的数据看起来是一维的。dtype 则是指定元素的数据类型,比如 int32、float64、bool_ 等,这能帮你精确控制内存使用和计算精度。
# 创建一个三维数组(虽然数据只是一维的)
arr_3d = np.array([1, 2, 3], ndmin=3)
print("强制创建的三维数组:")
print(arr_3d)
print("它的形状是:", arr_3d.shape)
# 输出:
# 强制创建的三维数组:
# [[[1 2 3]]]
# 它的形状是: (1, 1, 3)
除了从现有数据转换,NumPy还提供了很多“无中生有”创建数组的妙招,特别适合做实验或者初始化数据。比如 np.zeros() 创建全0数组,np.ones() 创建全1数组,np.empty() 创建未初始化的数组(内容随机,取决于内存当时的状态,速度最快)。这些函数只需要你告诉它形状(shape)就行。
# 创建一个2行3列的全零矩阵
zeros_matrix = np.zeros((2, 3))
print("2x3的全零矩阵:\n", zeros_matrix)
# 创建一个3x3x3的三维全1数组
ones_cube = np.ones((3, 3, 3))
print("\n3x3x3全1数组的形状:", ones_cube.shape)
# 创建一个2行4列的未初始化数组
empty_arr = np.empty((2, 4))
print("\n未初始化数组(内容随机):\n", empty_arr)
还有两个生成序列的神器:np.arange() 和 np.linspace()。arange 类似于Python的 range,但直接生成数组,可以指定步长和数据类型。linspace 则是在指定的起止点之间,生成等间隔的固定数量的数,特别适合做坐标轴。
# 生成从0到9(不含10)的整数数组
arr_range = np.arange(10)
print("arange(10):", arr_range)
# 生成从1到5,包含6个等间距的数
arr_lin = np.linspace(1, 5, 6)
print("linspace(1,5,6):", arr_lin)
# 输出:linspace(1,5,6): [1. 1.8 2.6 3.4 4.2 5. ]
1.1 数组的“身份证”:几个关键属性
创建了数组,你得会看它的“基本信息”。这几个属性我每次都会检查,就像认识新朋友先问名字和职业一样。
- ndim:数组的维度(轴)数量。一个普通的列表转换过来就是1维(1D),矩阵是2维(2D),以此类推。
- shape:一个元组,告诉你每个维度上有多少个元素。比如
(3, 4)表示3行4列。这是理解数组结构最重要的属性。 - size:数组里所有元素的总个数,等于
shape里各个数字的乘积。 - dtype:数组元素的数据类型,比如
int32、float64、<U10(表示长度不超过10的字符串)。 - itemsize:数组中每个元素占用的字节数。
int32就是4字节,


1407

被折叠的 条评论
为什么被折叠?



