我试图用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变量的使用看起来很难看,尤其是每次在循环中创建它时。
答案 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
的替代方法是mgrid
或ogrid
(虽然我必须在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)]]