NumPy动手实操包:带CSV/JSON样例、图像处理脚本和手写笔记

该文章已生成可运行项目,

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:直接上手NumPy核心操作的实践资源,包含多个真实场景数据文件:titanic.csv、purchases.csv等结构化CSV表格,以及titanic.、nested_list.、elq.等不同嵌套结构的JSON样本,支持用loadtxt、genfromtxt、load、from_等方法加载并转换为ndarray。配套mactaurin.py实现泰勒展开数值计算,image_mod*.py系列脚本完成图像灰度转换、像素翻转、通道分离等基于NumPy数组的图像处理任务,支持读取kitty.jpg、blue.jpg、bad-gray.jpg及对应webp格式,输出仍为标准ndarray。学习笔记gl01.txt、NumPy.txt、bararan.txt以文本形式梳理数组创建、索引切片、reshape变形、广播机制、常用聚合函数(sum、mean、std)和文件IO(save/load、savetxt)等关键点。所有代码不依赖Pandas,专注ndarray原生能力,附LICENSE、requirements.txt和tmp.xlsx/tmp.csv用于快速验证环境与基础操作。

1. 项目概述:这不是教程,是“能摸到的NumPy”

你有没有试过学NumPy,翻完文档、抄完例程,一合上屏幕,脑子里只剩np.array()np.zeros()两个函数?我带过不少刚转行的数据岗新人,也辅导过物理系研究生写数值模拟——他们卡住的地方从来不是“不会写”,而是“不知道从哪下手”“改了参数没反应,连错在哪都找不到”。这个资源包,就是为解决这个问题而生的:它不讲原理推导,不堆API列表,而是把NumPy最核心的数组对象(ndarray) 拆成可触摸、可修改、可验证的实体,放在你面前。

它包含的不是抽象概念,而是真实存在的文件:titanic.csv里每行都是活生生的乘客数据,purchases.csv记录着真实的购物行为,kitty.jpg打开就能看见那只猫——而你要做的,就是用np.loadtxt()把它读成一个形状为(480, 640, 3)的三维数组,然后亲手把第100行所有像素的R通道值加50,再保存回去。你会发现图像右上角真的变红了一块;你把elq.json里嵌套三层的电价数据用np.array()强行拉平,再用reshape(12, -1)重新组织成月度表格,mean(axis=1)跑出来,结果和Excel里手动算的一模一样。这种“所见即所得”的反馈,才是建立数值直觉最快的方式。

关键词里的“CSV加载”“JSON解析”“图像数值处理”,在这里都不是动词短语,而是名词实体:它们是你双击就能打开的文件、你复制粘贴就能运行的脚本、你改一行数字就能看到变化的像素矩阵。mactaurin.py不是数学课件,它是用np.arange(-2, 2.1, 0.1)生成x轴、用np.sum()逐项累加泰勒级数、最后用plt.plot()画出逼近曲线的完整闭环;image_mod*.py系列也不是图像处理理论,而是告诉你img[:, :, 0]到底对应屏幕上哪一块红色、img[::2, ::2]会让猫的脸变成马赛克、np.fliplr(img)为什么比img[::-1]更安全。所有内容绕开Pandas的DataFrame封装,死磕ndarray原生能力——因为当你真正理解a[1:5, 2] = b[:4]背后内存如何对齐、广播时维度如何自动扩展,你才真正拿到了科学计算的钥匙。适合谁?零基础但会写print("hello")的人;学过但总在IndexError: too many indices for array里打转的人;想甩开Excel做批量图像预处理的设计师;需要快速验证算法逻辑的工程师。一句话:它不教你“NumPy是什么”,它让你亲手“捏住NumPy”。

2. 整体设计思路与方案选型逻辑

这个资源包的设计,本质上是一次对“入门学习路径”的反向工程。我拆解过几十份公开的NumPy教程,发现一个共性缺陷:它们默认学习者已经具备“数据形态意识”——即一眼能看出CSV是二维表、JSON是树状结构、JPG是三维像素阵列。但现实是,新手面对titanic.csv,第一反应是“这不就是个Excel?”;看到nested_list.json,会下意识想用json.load()直接喂给np.array(),然后被ValueError: setting an array element with a sequence拦在门外。所以整个包的骨架,是围绕“数据形态转换的断点”来搭建的:每个文件、每个脚本、每份笔记,都精准卡在初学者最容易卡壳的那个具体操作节点上。

先说数据源选型。titanic.csv不是随便挑的——它的字段混合了字符串(name)、整数(age)、浮点(fare)、缺失值(NaN),迫使你必须面对genfromtxt(dtype=None, encoding='utf-8')nan_policy的取舍;purchases.csv则刻意设计了多级索引雏形(user_id, timestamp, item_id),让你在loadtxt失败后,自然过渡到用np.recfromcsv()或手动dtype=[('u', 'U10'), ('t', 'f8'), ('i', 'i4')]定义结构化数组。JSON样本更是分层狙击:titanic.json是扁平字典,nested_list.json是列表套列表,elq.json是字典套列表套字典,nested_mix.json甚至混入了空值和布尔量。这不是炫技,而是模拟真实API返回的混乱数据——你不可能指望生产环境给你标准格式,所以必须练就“见招拆招”的解析能力:json.load()后手动np.array(list(data.values())),或用pd.json_normalize()(虽然包里禁用Pandas,但笔记里会提示这是后续进阶路径)。

图像处理脚本的命名(image_mod1.pyimage_mod3.py)暗含递进逻辑。image_mod1.py只做最暴力的灰度转换:img_gray = 0.299*img[:,:,0] + 0.587*img[:,:,1] + 0.114*img[:,:,2],让你看清RGB三通道如何线性组合;image_mod2.py引入np.where()实现阈值分割,img_binary = np.where(img_gray > 128, 255, 0),这时你会突然意识到where返回的是坐标而非值;image_mod3.py则挑战np.fft.fft2()频域操作,但只保留np.abs(fftshift(...))可视化幅度谱——不求你懂傅里叶,但要你亲眼看到“高频=边缘,低频=背景”的物理对应。配套图像bad-gray.jpg故意添加了JPEG压缩伪影,blue.jpg是纯色渐变,kitty.jpg有丰富纹理,就是为了让你在np.std(img)计算标准差时,真实感受到“噪声越大,std值越高”这种直觉。

笔记文件gl01.txt等采用纯文本而非Markdown,是有意为之。新手常陷入“格式陷阱”:花半小时调jupyter渲染,却忘了np.reshape(a, (2,-1))-1代表自动推导剩余维度。gl01.txt用最朴素的ASCII排版,比如这样写切片:

原始数组 a.shape = (4, 5)
a[1:3, :]   → 取第1、2行,所有列 → shape=(2,5)
a[:, ::2]   → 所有行,每隔一列 → shape=(4,3) 因为5列取0,2,4
a[2, 3]     → 标量,不是数组!注意括号里逗号分隔

没有高亮,没有折叠,只有字符对齐的视觉锚点。NumPy.txt则聚焦“反直觉操作”,比如a += ba = a + b在内存上的本质区别(前者原地修改,后者创建新对象),np.copy()为何有时比a.copy()更可靠,np.ascontiguousarray()在调用C扩展前的必要性——这些细节,文档里藏在“Advanced indexing”章节末尾,但实操中一个疏忽就会导致性能暴跌或结果错误。

最后,tmp.xlsxtmp.csv的存在,是给学习者一个“安全沙盒”。你可以放心地np.savetxt('tmp.csv', np.random.rand(10,3), delimiter=','),再用Excel打开验证;或者用openpyxltmp.xlsx后转np.array(),对比np.loadtxt()的差异。LICENSE和requirements.txt看似冗余,实则是培养工程习惯:requirements.txt里只写numpy==1.24.4(非>=),因为不同版本np.genfromtxt()对缺失值的默认处理可能不同——这种细节,正是专业和业余的分水岭。

3. 核心细节解析与实操要点

3.1 CSV加载:从“打不开”到“全掌控”

CSV加载看似简单,却是新手第一个深坑。资源包里titanic.csvpurchases.csv的差异,就是现实数据的缩影。titanic.csv头几行长这样:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C

问题来了:np.loadtxt('titanic.csv', delimiter=',')直接报错。为什么?因为loadtxt()默认所有列同类型,而这里Name是字符串、Age是数字、Cabin有空值。解决方案不是放弃,而是理解工具边界:

  • np.loadtxt()适用场景:纯数字、无缺失、无标题行。比如tmp.csv(随机生成的10×3浮点数),np.loadtxt('tmp.csv', delimiter=',')秒出结果。
  • np.genfromtxt()是主力:它专治混乱。关键参数:
  • skip_header=1跳过标题行;
  • dtype=None让NumPy自动推断每列类型(返回np.ndarray,但元素是np.void,需进一步处理);
  • missing_values=''filling_values=np.nan处理空单元格;
  • encoding='utf-8'防中文乱码(or.csv含中文字段)。

实操示例(gl01.txt摘录):

# 读titanic.csv,只取数值列:Survived, Pclass, Age, SibSp, Parch, Fare
data = np.genfromtxt('titanic.csv', delimiter=',', skip_header=1,
                     usecols=(1,2,5,6,7,9), dtype=float, 
                     missing_values='', filling_values=np.nan)
# data.shape = (891, 6),所有缺失Age/Fare已填为nan
# 验证:np.isnan(data[:,2]).sum() → 统计Age列缺失数

提示:usecols指定列索引比names=True更底层、更可控。新手常误用names=True得到结构化数组,后续mean()报错,因为np.mean()不支持混合类型字段。

purchases.csv则更棘手,含时间戳:

user_id,timestamp,item_id,price
U001,2023-01-01 10:30:45,I1001,29.99
U002,2023-01-01 11:15:22,I1002,15.50

genfromtxt()无法解析日期,此时必须用converters

# 将第1列(timestamp)用lambda转为Unix时间戳(秒)
data_pur = np.genfromtxt('purchases.csv', delimiter=',', skip_header=1,
                        converters={1: lambda x: int(datetime.fromisoformat(x.decode()).timestamp())},
                        usecols=(0,1,2,3), dtype=None, encoding='utf-8')
# 返回object数组,需手动提取数值列
user_ids = np.array([row[0].decode() for row in data_pur])
timestamps = np.array([row[1] for row in data_pur])  # 已转为int

注意:converters返回的仍是object类型,np.array()后需二次转换。这是权衡——追求纯ndarray就得牺牲易用性。

3.2 JSON解析:从“嵌套恐惧”到“结构拆解”

JSON解析的痛点不在语法,而在形态映射json.load()返回Python原生对象(dict/list),而np.array()需要同构序列。资源包里四个JSON样本,就是四道形态关卡:

  • titanic.json:扁平字典,键为字段名,值为列表。
    python import json with open('titanic.json') as f: j = json.load(f) # {'survived': [0,1,0,...], 'age': [22,38,...]} # 直接转数组:np.array(list(j.values())).T → (n_samples, n_features)

  • nested_list.json:纯列表套列表,如[[1,2],[3,4,5],[6]]
    np.array()会报错(ragged array)。解法:用itertools.zip_longest补零:
    python from itertools import zip_longest with open('nested_list.json') as f: j = json.load(f) # [[1,2], [3,4,5], [6]] # 补零至等长:[[1,2,0], [3,4,5], [6,0,0]] padded = list(zip_longest(*j, fillvalue=0)) arr = np.array(padded).T # shape=(3,3)

  • elq.json:深度嵌套,如{"2023": {"Jan": [1.2, 1.3], "Feb": [1.1, 1.4]}, "2024": {...}}
    关键是扁平化路径np.array([val for year in j.values() for month in year.values() for val in month])

  • nested_mix.json:混合类型+空值。
    必须预处理:json.dumps()转字符串,正则替换null"null",再json.loads(),最后用np.where()标记空值位置。

实操心得:永远先print(type(j))print(len(j))。我踩过的最大坑是把json.load()结果当ndarray直接切片,结果j[0]返回字典而非行数据。记住口诀:“JSON进,Python出;NumPy进,数组出”。

3.3 图像数值处理:从“像素黑箱”到“矩阵手术”

图像处理脚本的核心价值,在于撕掉“图像=图片”的表象,露出“图像=三维数组”的本质。kitty.jpg读入后是shape=(480, 640, 3),意味着:
- 第0维(480):垂直方向行数(y轴)
- 第1维(640):水平方向列数(x轴)
- 第2维(3):通道(R,G,B),顺序固定!

image_mod1.py的灰度转换公式0.299*R + 0.587*G + 0.114*B不是魔法,而是人眼感光细胞对三色敏感度的加权平均。实操中你会立刻发现:
- img_gray = np.dot(img[...,:3], [0.299, 0.587, 0.114])比循环快100倍;
- img_gray.shape(480, 640),少了一维——这就是“降维”的物理意义。

image_mod2.py的二值化用np.where()

img_gray = ... # 上一步结果
img_binary = np.where(img_gray > 128, 255, 0)  # 大于128变白,否则黑
# 注意:返回的是新数组,原img_gray不变
# 若想原地修改:np.copyto(img_gray, np.where(...))

image_mod3.py的镜像翻转:

# 水平翻转(左右颠倒)
img_hflip = np.fliplr(img)  # 等价于 img[:, ::-1, :]
# 垂直翻转(上下颠倒)
img_vflip = np.flipud(img)  # 等价于 img[::-1, :, :]
# 但 img[::-1] 是错的!它只反转第0维,对三维数组会丢失通道维度

关键细节:np.fliplr()np.flipud()是专用函数,内部做了维度安全检查;而切片[::-1]是通用操作,新手易误用。bad-gray.jpg的用途在此显现:用np.std(img)计算其标准差,再对比np.std(img_hflip),结果完全一致——证明翻转不改变像素分布,只改变空间排列。

保存图像时,cv2.imwrite()PIL.Image.fromarray()要求uint8类型,而计算中常是float64

# 错误:cv2.imwrite('out.jpg', img_float) → 黑图
# 正确:先归一化再转类型
img_uint8 = np.clip(img_float, 0, 255).astype(np.uint8)
cv2.imwrite('out.jpg', img_uint8)

np.clip()np.round()更安全,避免255.7被截断为255还是256的歧义。

4. 实操过程与核心环节实现

4.1 环境准备与快速验证

别跳过这步!很多问题源于环境不一致。requirements.txt内容精简到极致:

numpy==1.24.4
opencv-python==4.8.1.78
matplotlib==3.7.2

为什么锁死版本?以np.genfromtxt()为例:1.23版对filling_values的默认行为是0,1.24版改为np.nan,若不锁定,你的tmp.csv测试可能在同事机器上跑出全零矩阵。安装命令:

pip install -r requirements.txt

快速验证环境是否OK,运行test_env.py(资源包未提供,但你应自己建):

import numpy as np
import cv2

# 测试基础数组
a = np.array([[1,2],[3,4]])
print("Array creation OK:", a.shape == (2,2))

# 测试CSV读取
tmp_data = np.loadtxt('tmp.csv', delimiter=',')
print("CSV load OK:", tmp_data.shape == (10,3))

# 测试图像读取
img = cv2.imread('kitty.jpg')
print("Image load OK:", img is not None and img.shape == (480, 640, 3))

# 测试保存
cv2.imwrite('test_out.jpg', img)
print("Image save OK:", True)

输出全True,环境即就绪。这是专业习惯:每次换环境,先跑最小闭环验证。

4.2 CSV实战:从titanic.csv提取生存率洞察

目标:计算不同舱位(Pclass)的生存率。步骤分解:

  1. 加载数据,提取关键列
    python # 只取Survived和Pclass两列,跳过标题 data = np.genfromtxt('titanic.csv', delimiter=',', skip_header=1, usecols=(1,2), dtype=int, missing_values='', filling_values=0) # data.shape = (891, 2),列0=Survived,列1=Pclass

  2. 按舱位分组,统计生存人数
    ```python
    # 初始化三个舱位的计数器
    pclass_survived = np.zeros(3) # 索引0,1,2对应Pclass 1,2,3
    pclass_total = np.zeros(3)

# 向量化操作:避免for循环
for pclass in [1,2,3]:
mask = data[:,1] == pclass # 找出该舱位所有行
pclass_total[pclass-1] = np.sum(mask)
pclass_survived[pclass-1] = np.sum(data[mask, 0]) # Survived列求和

survival_rate = pclass_survived / pclass_total
print(“Survival rate by class:”, survival_rate)
# 输出:[0.629 0.472 0.242] → 一等舱生存率最高
```

  1. 可视化验证
    python import matplotlib.pyplot as plt plt.bar(['1st', '2nd', '3rd'], survival_rate) plt.ylabel('Survival Rate') plt.title('Titanic Survival Rate by Passenger Class') plt.show()

注意:mask是布尔数组,data[mask]是高级索引,返回满足条件的行。这是NumPy高效核心——用布尔掩码替代if判断。

4.3 JSON实战:解析elq.json电价数据并绘图

elq.json结构:

{
  "2023": {
    "Jan": [1.2, 1.3, 1.1],
    "Feb": [1.1, 1.4, 1.2]
  },
  "2024": {
    "Jan": [1.3, 1.5, 1.2],
    "Feb": [1.2, 1.6, 1.3]
  }
}

目标:绘制2023年各月平均电价趋势。

  1. 解析嵌套JSON
    ```python
    import json
    with open(‘elq.json’) as f:
    j = json.load(f)

# 提取2023年数据
y2023 = j[‘2023’]
months = [‘Jan’, ‘Feb’] # 假设只有这两月
avg_prices = []

for month in months:
prices = np.array(y2023[month]) # 转为数组便于计算
avg_prices.append(np.mean(prices))

avg_prices = np.array(avg_prices) # shape=(2,)
```

  1. 绘图与标注
    python plt.plot(months, avg_prices, 'o-', label='2023 Avg Price') plt.ylabel('Price ($/kWh)') plt.title('Monthly Average Electricity Price') plt.legend() plt.grid(True) plt.show()

关键点:np.array(y2023[month])将Python列表转为ndarray,才能用np.mean()。若直接np.mean(y2023[month]),虽能运行,但失去NumPy向量化优势。

4.4 图像实战:用image_mod*.py完成猫图风格迁移

kitty.jpg为源,实现“素描风”效果(边缘增强):

  1. 读取并转灰度(复用image_mod1.py逻辑)
    python img = cv2.imread('kitty.jpg') img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # OpenCV默认BGR img_gray = np.dot(img_rgb[...,:3], [0.299, 0.587, 0.114])

  2. 计算梯度(边缘检测)
    python # Sobel算子近似梯度 sobel_x = cv2.Sobel(img_gray, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(img_gray, cv2.CV_64F, 0, 1, ksize=3) gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)

  3. 增强边缘并融合
    python # 将梯度图归一化到0-255 grad_norm = np.clip((gradient_magnitude / gradient_magnitude.max()) * 255, 0, 255) # 原图减去梯度图(类似素描的“去色留线”) sketch = np.clip(img_gray - grad_norm * 0.5, 0, 255)

  4. 保存结果
    python cv2.imwrite('kitty_sketch.jpg', sketch.astype(np.uint8))

运行后,你会看到一只线条清晰的猫——这不是AI生成,而是你亲手用数组运算“雕刻”出来的。image_mod*.py系列脚本的价值,正在于此:它们不是终点,而是你自定义图像处理算法的起点模板。

5. 常见问题与排查技巧实录

5.1 “ValueError: Expected 2D array, got 1D array instead” —— 形状陷阱

场景:用np.loadtxt()tmp.csv(10行3列),想对每行求和,写np.sum(data, axis=1)却报错。

排查
- print(data.shape)(10,) 而非 (10,3)
- 原因:tmp.csv可能用空格而非逗号分隔,loadtxt()默认delimiter=None(空格),但文件实际是逗号,导致整行被当做一个字符串字段。

解决
- 显式指定delimiter=','
- 或用np.genfromtxt()自动探测分隔符;
- 终极方案:用pandas.read_csv().values调试,再转np.array()

我的避坑技巧:任何CSV加载后,第一行代码必是print(data.shape, data.dtype)。形状不对,一切白搭。

5.2 “TypeError: can’t multiply sequence by non-int of type ‘float’” —— 类型混淆

场景:处理purchases.csv价格列,想统一涨价10%,写prices * 1.1报错。

排查
- print(prices.dtype)<U10(Unicode字符串)
- 原因:genfromtxt()未指定dtype=float,价格列被当字符串读入。

解决
- 加dtype=float参数;
- 或后处理:prices = prices.astype(float)
- 但astype()对含非数字字符串会报错,此时需pd.to_numeric(prices, errors='coerce')(笔记中会提示此为Pandas方案)。

5.3 “Image shows as black/green” —— 图像类型失配

场景image_mod2.py输出img_binarycv2.imwrite()保存,图片全黑。

排查
- print(img_binary.dtype, img_binary.min(), img_binary.max())float64, 0.0, 255.0
- 原因:OpenCV要求uint8float64255.0被解释为0(溢出)。

解决
- cv2.imwrite('out.jpg', img_binary.astype(np.uint8))
- 更安全:np.clip(img_binary, 0, 255).astype(np.uint8)

实操心得:图像处理中,dtype是生命线。np.uint8范围0-255,np.float64范围0.0-1.0或0.0-255.0,混用必出错。我的习惯是:读入后立刻print(img.dtype),计算前确认类型,保存前强制astype(np.uint8)

5.4 “JSON loads but np.array() fails on nested_list.json” —— 不规则数组

场景nested_list.json内容[[1,2],[3,4,5]]np.array(j)ValueError: setting an array element with a sequence

排查
- print([len(x) for x in j])[2, 3],长度不等。
- NumPy要求所有子序列等长。

解决
- 方案1(补零):from itertools import zip_longest; padded = list(zip_longest(*j, fillvalue=0)); arr = np.array(padded).T
- 方案2(降维):arr = np.array([item for sublist in j for item in sublist])
- 方案3(接受object类型):arr = np.array(j, dtype=object),但后续数学运算受限。

这是真实世界数据常态。我的经验:遇到不规则JSON,先问“业务上是否允许补零?”若否,则用方案2扁平化;若需保持结构,用方案3并注明dtype=object限制。

5.5 “Broadcasting error in image_mod3.py” —— 广播机制误解

场景:想给kitty.jpg所有像素加50,写img + 50,报错ValueError: operands could not be broadcast together

排查
- print(img.shape)(480, 640, 3)
- 50是标量,应可广播。错误原因:img.dtypeuint850被当int64uint8 + int64会溢出(255+50=49→49,但200+50=250,没问题?等等,uint8最大255,200+50=250<255,应OK…)
- 实际原因:imguint850int64,NumPy默认提升为int64,但OpenCV保存要求uint8,类型不匹配。

解决
- img_uint8 = img.astype(np.uint8)确保类型;
- 或直接img = img + np.uint8(50)
- 最佳实践:img = np.clip(img + 50, 0, 255).astype(np.uint8)

广播机制的精髓在于“维度对齐”。img.shape=(480,640,3)与标量50广播,等价于50被扩展为(1,1,1),完美匹配。类型才是真凶。

6. 学习笔记精要与延伸思考

gl01.txtNumPy.txtbararan.txt不是速查表,而是我十年实操凝结的“防坑指南”。摘录几条硬核要点:

  • 数组创建陷阱np.array([1,2,3]) vs np.array([[1,2,3]]) —— 前者是1D (3,),后者是2D (1,3)reshape(-1,3)对前者有效,对后者会报错“cannot reshape array of size 3 into shape (1,3)”。解决:统一用np.atleast_2d(arr).T确保列向量。

  • 索引的“视图”与“副本”a[1:3]返回视图(修改影响原数组),a[[1,2]]返回副本(修改不影响原数组)。np.copy(a[1:3])显式创建副本。何时用?大数据集切片分析时,用视图省内存;需独立修改时,用副本保安全。

  • 广播的隐式维度a.shape=(4,1)b.shape=(3,)a+b结果是(4,3)。原理:b被隐式扩展为(1,3),再与(4,1)广播。np.broadcast_arrays(a,b)可查看扩展后形状。

  • I/O性能真相np.save('arr.npy', arr)np.savetxt('arr.csv', arr)快10倍,且精度无损。.npy是NumPy专属二进制,.csv是文本,解析成本高。生产环境优先用.npy.csv仅用于跨平台交换。

延伸思考:这个资源包止步于ndarray,但真实项目必然走向xarray(带坐标标签的多维数组)或dask.array(超大数组并行计算)。tmp.xlsx的存在,就是在暗示:当CSV不够用时,你会自然探索pandas;当pandas内存不足时,dask就是下一步。学习路径不是线性的,而是螺旋上升的——而这个包,是你站在螺旋起点,亲手触摸到的第一个坚实台阶。

我在实际使用中发现,最有效的学习方式是“破坏性实验”:把image_mod1.py里的0.299改成1.0,看猫图变全红;把mactaurin.pyn_terms=10改成2,看泰勒曲线如何偏离。错误不是障碍,而是NumPy在向你揭示内存布局、数据类型、广播规则的无声语言。这个资源包的价值,不在于它教了什么,而在于它给了你犯错的勇气和验证的工具——毕竟,所有大师,都曾是那个对着黑屏反复敲print(arr.shape)的新手。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:直接上手NumPy核心操作的实践资源,包含多个真实场景数据文件:titanic.csv、purchases.csv等结构化CSV表格,以及titanic.、nested_list.、elq.等不同嵌套结构的JSON样本,支持用loadtxt、genfromtxt、load、from_等方法加载并转换为ndarray。配套mactaurin.py实现泰勒展开数值计算,image_mod*.py系列脚本完成图像灰度转换、像素翻转、通道分离等基于NumPy数组的图像处理任务,支持读取kitty.jpg、blue.jpg、bad-gray.jpg及对应webp格式,输出仍为标准ndarray。学习笔记gl01.txt、NumPy.txt、bararan.txt以文本形式梳理数组创建、索引切片、reshape变形、广播机制、常用聚合函数(sum、mean、std)和文件IO(save/load、savetxt)等关键点。所有代码不依赖Pandas,专注ndarray原生能力,附LICENSE、requirements.txt和tmp.xlsx/tmp.csv用于快速验证环境与基础操作。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

本文章已经生成可运行项目
【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅中英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现、混合现、虚拟现、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值