Python 现代开发学习笔记

(七)按位置数组与布尔条件选取记录

1. 配对坐标与行列组合

需要第 1、3 天,可以把行号组成 [0,2]。同时给两个坐标数组时,NumPy 按对应位置配对:

# 项目文件:demos/advanced_index.py
# 整数数组按配对坐标选择;ix_ 形成行列组合;高级索引读取结果保存独立数据。
import numpy as np

a = np.array([[10, 20], [30, 40], [50, 60]])
picked = a[[0, 2]]
picked[0, 0] = 999
print("配对", a[[0, 2], [1, 0]].tolist())
print("交叉", a[np.ix_([0, 2], [1, 0])].tolist())
print("独立结果", a[0, 0].item(), picked[0, 0].item())
print("整行筛选", a[a[:, 0] >= 30].tolist())
print("逐格筛选", a[a >= 30].tolist())
a[a >= 50] = 0
print("直接赋值", a.tolist())

a[[0,2],[1,0]] 选择 (0,1) 与 (2,0),结果为 [20,50]。若要选第 1、3 行与第 2、1 列的全部组合,用 ix_ 建立交叉索引,结果为 [[20,10],[60,50]]。

整数数组、布尔数组参与的这种读取称为高级索引,得到独立数据;修改 picked 不改变 a。对原数组直接执行 a[条件]=值,则是向选中位置写入,并非先拿一份结果出来再修改。数组索引

两个坐标数组逐项配对得到两个位置,ix建立行列全部组合,高级索引读取后的修改不回写

2. 选整行与选每个元素

a[:,0]>=30 得到形状 (3,) 的条件,用它选择后两天,结果仍是二维。a>=30 得到 (3,2) 的逐格条件,用它读取后把四个满足条件的值组成一维 [30,40,50,60]。

条件本身也有 shape。目录项目会让已读状态保持 (书籍数,),用它筛选标签矩阵的书籍行,让筛选后的每一行仍对应完整的一本书。

长度为三的条件筛整行,三乘二的条件筛单格;直接条件赋值写回原数组

笔记正文与全部题解 · Ctrl / ⌘ K