如何用纯NumPy(无循环)方式创建含ND索引与值的数组?
纯NumPy实现索引与值的组合数组
当然有纯NumPy的实现方式,完全不需要依赖循环或列表推导式,下面是两种简洁的实现方案:
方案一:分步实现(清晰易懂)
import numpy as np a = np.arange(12).reshape(3, 4) # 生成对应维度的索引网格 indices = np.indices(a.shape) # 将索引网格转换为每行对应一个元素索引的二维数组 flat_indices = indices.reshape(len(indices), -1).T # 将原数组拉平为列向量 flat_values = a.reshape(-1, 1) # 横向拼接索引与值 b = np.hstack((flat_indices, flat_values)) print(b)
方案二:一行式简洁实现
import numpy as np a = np.arange(12).reshape(3, 4) b = np.column_stack(np.indices(a.shape) + (a,)) print(b)
输出结果(与原实现一致)
[[ 0 0 0] [ 0 1 1] [ 0 2 2] [ 0 3 3] [ 1 0 4] [ 1 1 5] [ 1 2 6] [ 1 3 7] [ 2 0 8] [ 2 1 9] [ 2 2 10] [ 2 3 11]]
原理说明
np.indices(a.shape):生成与原数组维度匹配的索引网格,比如二维数组会返回两个形状为(3,4)的数组,分别对应每个元素的行索引和列索引。np.column_stack:将多个一维/二维数组按列拼接,自动将高维数组拉平为一维后组合,最终得到每行对应一个元素的「索引+值」结构。
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

