python:使数组索引生成更高效/更优雅

时间:2014-08-15 23:13:52

标签: python numpy

我试图用python获取一些数组索引。目前,代码看起来非常麻烦,我想知道我是在低效率还是在unpythonic风格。所以,我有一个n维数组,我试图生成一些索引,如下所示。这是一个孤立的代码示例,演示了我想要做的事情。我在一个简单的2D代码段中演示了这个,但是数组可以是任意维度。

import numpy as np

a = np.random.rand(5, 5)
shape = a.shape

for i in range(len(shape)):
    shape_temp = np.zeros(len(shape), dtype=np.int)
    shape_temp[i] = 1
    p = np.meshgrid(*[np.arange (shape_temp[l], shape[l]) for l in range(len(shape))])

    # Do something with p

我想知道是否有一种更优雅,更有希望的方式来生成这些指数?特别是这个shape_temp变量的使用看起来很难看,尤其是每次在循环中创建它时。

1 个答案:

答案 0 :(得分:1)

shape_temp = np.zeros_like(shape)

您可以使用以下表达式来避免shape_temp

[np.arange(1 if l==i else 0, e) for l,e in enumerate(shape)]

是否更漂亮或更有效率是值得商榷的

另一个片段

temp = np.eye(len(shape))
[np.arange(j,k) for j,k in zip(temp[i,:],shape)]

meshgrid的替代方法是mgridogrid(虽然我必须在indexing中进行更改才能获得匹配)。表达式更紧凑,因为它们采用slices而不是ranges。在内部,这些函数使用arange

meshgrid(*[np.arange(j,k) for j,k in zip(temp[i,:],shape)],indexing='ij')
np.mgrid[[slice(j,k) for j,k in zip(temp[i,:],shape)]]

meshgrid(*[np.arange(j,k) for j,k in zip(temp[i,:],shape)],sparse=True,indexing='ij')
np.ogrid[[slice(j,k) for j,k in zip(temp[i,:],shape)]]