在这里插入图片描述

大家好,我是飞哥。👋

最近有粉丝在后台问我:“飞哥,我Python语法都学会了,List也很熟,为啥看AI代码还是一脸懵?那些 np.array 到底是个啥?为啥不用List?”

别急,今天飞哥就用一杯咖啡的时间,带你把这个AI领域的“地基”——NumPy,彻底铲平。

如果你是像我一样的 老Android/Java开发,这篇更是为你量身定制的。我们不整那些虚头巴脑的数学公式,直接上干货!


1. 灵魂拷问:为什么Python List被嫌弃了?🐢

在做App开发时,我们习惯用 ArrayList 或者 Python 的 List。但在AI领域,我们要处理的数字是 百万、千万级 的(比如一张1080P的图片就有200多万个像素点)。

这时候,Python List 就显出原形了:

  • 它是“杂乱的储物箱”:List里不仅存数字,还要存类型、引用地址… CPU每次拿一个数,都要解包、检查、计算、打包。太累了!
  • NumPy是“整齐的兵马俑”:它在内存里是一块 连续的空间,所有元素类型必须一样(比如都是 int32)。CPU一看:“好家伙,全是整齐的兵,直接批量处理!”(这叫SIMD技术)。

NumPy 比纯 Python List 快 10 到 100 倍。做AI不学NumPy,就像骑自行车去送快递——不是不行,是真来不及啊!


2. 三步秒懂 NumPy ⚡️

第一步:找个参照物 (Android/Java视角) ⚓️

你熟悉 Java 的 int[] 数组吗?

  • Java 的 int[] 存的是原始类型 (Primitive Type),效率极高。
  • NumPy 的 ndarray 本质上就是 Python 版的 int[],但它加装了 V12双涡轮增压引擎

第二步:看个比喻 🤸

  • Python List 的循环:就像 点名

    老师:“张三,站起来,加1分。李四,站起来,加1分…” (磨磨唧唧)

  • NumPy 的向量化 (Vectorization):就像 广播体操

    广播:“所有人,统一起立,加1分!” (唰!瞬间完成)

第三步:记住核心 🦴

NumPy 就俩绝招:

  1. 向量化:消灭 for 循环,能批量咱就别由着性子一个一个来。
  2. 广播:矩阵和数字打架,NumPy会自动把数字“分身”成矩阵那么大,然后再打。

3. 飞哥的实战代码箱 (Copy就能用) 🧰

先装库(别告诉我你还没装环境,去翻我上一篇Conda教程):

pip install numpy

3.1 别再写For循环了!

任务:给100万个数字都乘10。

新手写法 (被嫌弃)

# 模拟数据
data = [1, 2, 3, 4, 5]
result = []
for x in data:
    result.append(x * 10) # 慢到想哭

print(result)
# 输出: [10, 20, 30, 40, 50]

飞哥写法 (NumPy)

import numpy as np

# 1. 创建数组
arr = np.array([1, 2, 3, 4, 5])

# 2. 向量化运算 (直接乘)
result = arr * 10  # 就在这一行,奇迹发生了

print(result)
# 输出: [10 20 30 40 50]

3.2 常用工厂:别老手写List

初始化数据时,这些函数比手写 [0, 0, 0...] 帅多了:

import numpy as np

# 1. 全0数组 (占坑专用)
zeros = np.zeros((2, 3)) 
print("全0数组:\n", zeros)
# 输出:
# [[0. 0. 0.]
#  [0. 0. 0.]]

# 2. 随机数 (模拟噪声、初始化权重)
# 生成 3行2列,0-1之间的随机小数
# 设置随机种子,保证每次运行结果一样(方便教学)
np.random.seed(42) 
random_vals = np.random.random((3, 2)) 
print("\n随机数组:\n", random_vals)
# 输出:
# [[0.37454012 0.95071431]
#  [0.73199394 0.59865848]
#  [0.15601864 0.15599452]]

# 3. 序列生成 (range的亲兄弟)
seq = np.arange(10) 
print("\n序列数组:", seq)
# 输出: [0 1 2 3 4 5 6 7 8 9]

3.3 坑点预警:Reshape (维度变换) ⚠️

这是新手报错Top 1!
AI模型经常矫情,非要 (N, 1) 的数据,不要 (N,) 的数据。

import numpy as np

arr = np.arange(12) # 形状是 (12,) 一根棍
print("原始形状:", arr.shape)
# 输出: (12,)

# 变成 3行4列 的板砖
reshaped = arr.reshape(3, 4)
print("\n3行4列:\n", reshaped)
# 输出:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 👇 这个最重要!自动计算行数,强制变成1列
column_vec = arr.reshape(-1, 1)
print("\n强制变1列:\n", column_vec)
# 输出:
# [[ 0]
#  [ 1]
#  ...
#  [11]]

3.4 谁是老大?(Argmax) 🏆

模型输出了一堆概率 [0.1, 0.7, 0.2],代表“猫、狗、鼠”。怎么让代码知道是“狗”?

import numpy as np

probs = np.array([0.1, 0.7, 0.2])

# argmax 返回最大值的【索引】
pred_class = np.argmax(probs) 

print(f"最大概率索引: {pred_class}") 
# 输出: 1

class_names = ["猫", "狗", "鼠"]
print(f"预测结果: {class_names[pred_class]}")
# 输出: 狗

4. 给Android兄弟的私房话 💡

  • Bitmap 就是 ndarray
    在Android里咱们处理 Bitmap 还要这一顿 getPixels。在Python里,用 cv2.imread 读进来的图,它天然就是一个NumPy数组!
    • 形状通常是 (Height, Width, 3) —— 3代表RGB通道。
  • 切片 (Slicing) 比 drawBitmap 爽多了
    想把图片右上角切下来?img[0:50, 100:200] 一行代码搞定,不需要算坐标画Canvas。

总结

兄弟们,记住一句话:NumPy 就是 Python 世界的“高性能数学计算器”。

做AI开发,只要看到 for 循环处理数组——想想能不能用 NumPy 批量解决?
觉得有用的,点个赞或者在评论区扣个“666”,飞哥接着更! 🚀

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐