python - 使用 range/arange 函数作为参数索引/切片 2d numpy 数组

标签 python arrays numpy range

我对numpy有一个基本的怀疑。我在 Ubuntu 14.04 上使用 Python 2.7、numpy-1.9.2。

例如,我将 2d numpy 数组初始化为 a = np.zeros((10,10))

然后我尝试通过以下方式使用范围函数作为索引来索引它的一部分:

a[范围(0,5),范围(0,5)]。我得到一个形状数组 (5,)。我想要的是二维数组 a 的前 5 行和前 5 列。

当我执行 a[:5,:5] 时,它似乎给了我一个形状为 (5,5) 的数组。

有人可以向我解释为什么使用范围函数指定索引会失败吗?即使在使用了将近一年之后,我仍然对 numpy 索引感到困惑。

提前感谢您的帮助。

最佳答案

对于range,您正在使用整数数组索引,如下所述:

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing

要获得 a[0:5,0:5] 的等价物,您必须利用“广播”。这里第一个索引是列向量

a[np.arange(0,5)[:,None],range(0,5)]

In [137]: np.arange(0,5)[:,None]
Out[137]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])

我可以详细介绍,但您也可以阅读该文档。


np.ix_ 是一个有助于生成这种索引数组的实用程序:

In [507]: np.ix_(range(0,5),range(0,5))
Out[507]: 
(array([[0],
        [1],
        [2],
        [3],
        [4]]), array([[0, 1, 2, 3, 4]]))

此 (5,1) 数组针对 (1,5) 数组进行广播以生成 (5,5) 索引数组。

MATLAB 和 numpy 选择了替代的高级索引方法:

在 MATLAB/Octave 中,a([1,2,3],[1,2,3]) 索引 (3,3) block 。在 numpy 中,a[[1,2,3],[1,2,3]] 索引 (3,) 对角线。

a(sub2ind(size(a),[1,2,3],[1,2,3])) 是 Octave 对角线; a[np.ix_([1,2,3],[1,2,3])]numpy block 。

关于python - 使用 range/arange 函数作为参数索引/切片 2d numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020143/

相关文章:

python - python中float的底层数据结构

c - 访问越界内存后,段错误不会立即出现

sql - SELECT * 其中所有 integer[] 单元格都在一组值中

python - 如何从 python 中给定的整数列表创建 bool 值的多列列表?

python - 当 A 列为 Null 时,确保 B 列 = 某个值 - Python

python - 使用数据框 pandas (ylabel) 绘图

python - 每隔 n 个位置将列表中的项目插入另一个列表

python - 根据列的值组合数据帧的行

javascript - 如何在javascript中将数组转换为没有逗号和空格分隔的字符串而不连接?

python-3.x - 'Float' 对象没有属性 'log'