基于Python的数据科学(6):Numpy基础

        在数据科学的世界中,Numpy 是一个至关重要的工具。它为高效的数组运算和数值计算提供了强大的支持。本篇文章将详细介绍 Numpy 的基础用法,包括数组的创建、属性、索引和切片、变形、拼接、广播等操作。

背景

        在之前的文章中,我们探讨了 Python 的基本数据类型、列表、元组、字典等基础数据结构。在数据科学领域,处理大规模数据是常见需求,而这些基础数据结构在效率和功能上往往难以满足需求。Numpy 提供了强大的多维数组对象 `ndarray`,以及丰富的库函数,极大地提升了数据处理的效率和方便性。

安装Numpy

        在使用 Numpy 之前,确保你已经安装了它。你可以使用以下命令来安装:

pip install numpy

数组的创建

从列表创建

        Numpy 数组可以通过 Python 的列表来创建,使用 np.array() 方法:

import numpy as np

l = [1, 2, 3, 4]
l_numpy = np.array(l)
print("List to numpy: ", l_numpy)

使用 Numpy 内置函数创建

        Numpy 提供了多种内置函数来创建数组:

print("1: Np zeros: \n", np.zeros(10, dtype=int))
print("2: Np ones:  \n", np.ones((3, 5), dtype=float))
print("3: Np full:  \n", np.full((4, 2), 3.14))
print("4: Np linspace: ", np.linspace(0, 1, 5))
print("5: Np logspace: ", np.logspace(1, 2, 5))
print("6: Np diag: \n", np.diag(np.arange(4)))
print("7: Np eye: \n", np.eye(3))
print("8: Np empty: ", np.empty(3))

创建多维数组

        Numpy 还可以创建多维数组:

l = [[1, 2], [3, 4]]
l_numpy = np.array(l)
print("Multidimensional: \n", l_numpy)

创建随机数组

        使用 Numpy 生成随机数组:

print("1: Randomize [0, 1) \n", np.random.random((3, 3)))
print("2: Random integers [0, 10) \n", np.random.randint(0, 10, (3, 3)))
print("3: Random float [3, 5) \n", np.random.uniform(3, 5, (3, 3)))
print("4: Normal dist. with m=0 and std=1 \n", np.random.normal(0, 1, (3, 3)))

数组的属性

数组的维度、形状和大小

x1 = np.random.randint(10, size=6)
x2 = np.random.randint(10, size=(3, 4))
x3 = np.random.randint(10, size=(3, 4, 5))

print(f"Dim: X1: {x1.ndim}, X2: {x2.ndim}, X3: {x3.ndim}")
print(f"Shape: X1: {x1.shape}, X2: {x2.shape}, X3: {x3.shape}")
print(f"Len (but only first dim!): X1: {len(x1)}, X2: {len(x2)}, X3: {len(x3)}")
print(f"Size: X1: {x1.size}, X2: {x2.size}, X3: {x3.size}")
print(f"Dtype: X1: {x1.dtype}, X2: {x2.dtype}, X3: {x3.dtype}")

索引和切片

基本索引

print("1: X1: ", x1)
print("2: X1 first element: ", x1[0])
print("3: X1 first two elements: ", x1[:2])
print("4: X1 last element: ", x1[-1])
print("5: X1 last two element: ", x1[-2:])

多维数组访问

print("1: X2: \n", x2)
print("2: X2 default access row-wise: ", x2[0])
print("3: X2 first row, third col: ", x2[0, 2])
print("4: X2 first row, last col: ", x2[0, -1])
print("5: X2 every row, last two col: \n", x2[:, -2:])
print("6: X2 reversed: \n", x2[::-1, ::-1])
print("7: X2 last two rows, every even col: \n", x2[-2:, 1::2])

修改数组元素

x2[0, -1] = 99.013
print("Modified X2: \n", x2)

变形

简单变形

grid = np.arange(1, 10).reshape((3, 3))
print("Grid: \n", grid)

1D 到 2D

X = np.array([11, 22, 33, 44, 55]).reshape((-1, 1))
print("1D to 2D: \n", X)

使用 np.newaxis

X = np.arange(4)
row_vec = X[np.newaxis, :]
col_vec = X[:, np.newaxis]
print("Row vector: \n", row_vec)
print("Column vector: \n", col_vec)

使用 -1 进行变形

X = np.array([[[ 0, 1], [ 2, 3]], [[ 4, 5], [ 6, 7]], [[ 8, 9], [10, 11]], [[12, 13], [14, 15]]])
X = X.reshape(-1, 2)
print("3D to 2D using -1: \n", X)

拼接

合并数组

X = np.array([[11, 22], [33, 44], [55, 66]])
Y = np.array([[11, 22], [33, 44], [55, 66]])

print("Row concat: \n", np.concatenate([X, Y]))
print("Col concat: \n", np.concatenate([X, Y], axis=1))

vstack 和 hstack

print("Vstack (row-wise): \n", np.vstack((X, Y)))
print("Hstack (col-wise): \n", np.hstack((X, Y)))

广播

广播基本操作

a = np.ones((2, 3))
b = np.arange(3)
print("A + B: \n", a + b)

广播规则示例

a = np.arange(3).reshape((3,1))
b = np.arange(3)
print("A + B: \n", a + b)

掩码

使用布尔掩码

rng = np.random.RandomState(0)
x = rng.randint(10, size=(3, 4))
print("Values less than 4: ", x[x < 4])

argwhere 和 any

print("Argwhere: \n", np.argwhere(x < 4))
print("Any value ==0? ", np.any(x == 0))

花式索引

基本示例

a = np.random.randint(100, size=10)
print("Fancy indices: ", a[[0, 3, 5]])

多维数组的花式索引

X = np.arange(12).reshape((3, 4))
row_ix = np.array([0, 1, 2])
col_ix = np.array([2, 1, 3])
print("X[row_ix, col_ix]: ", X[row_ix, col_ix])

其他有用的功能

# 转置
X = np.arange(4).reshape((2,2))
print("X : \n", X)
print("X Transposed : \n", np.transpose(X))

# 展平
a = np.array([[1,2], [3,4]])
print("a.flatten() : ", a.flatten())

# 压缩
X = np.ones((3,1))
print("np.squeeze(X) : ", np.squeeze(X).shape)

# argwhere
X = np.arange(6).reshape(2,3)
print("np.argwhere(x>1) : \n ", np.argwhere(X>1))

# argmax
a = np.arange(6).reshape(2,3) + 10
print("np.argmax(a) : ", np.argmax(a))

# argsort
X = np.array([3, 1, 2])
print("np.argsort(X) : ", np.argsort(X))

结语

        在这一篇文章中,我们详细介绍了如何创建和操作Numpy数组,包括创建、属性查询、索引和切片、重新整形、连接和堆叠、向量化、广播、掩码和花式索引等操作。Numpy是数据科学和机器学习中非常重要的工具,它提供了高效的数组运算和广泛的数学函数库。掌握Numpy的基本操作是进行更复杂的数据处理和分析的基础。

        通过本文的学习,你应该已经熟悉了Numpy的基本用法,并能在实际数据处理过程中应用这些知识。希望这些内容能帮助你在数据科学的道路上打下坚实的基础。

        在下一篇文章中,我们将深入探讨另一个强大的数据处理工具:Pandas。Pandas提供了更高级的数据结构和数据分析工具,使数据操作更加方便和高效。敬请期待!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值