使用数组进行Numpy索引

时间:2012-09-21 12:12:29

标签: multidimensional-array numpy

我正在尝试从数组返回一个(方形)部分,其中索引环绕边缘。我需要处理一些索引,但是它有效,但是,我希望最后两行代码具有相同的结果,为什么不呢? numpy如何解释最后一行?

作为一个额外的问题:我采用这种方法可能效率低下吗?我正在使用product,因为我需要对范围进行模数设计以便它包围,否则我当然会使用a[imin:imax, jmin:jmax, :]

import numpy as np
from itertools import product

i = np.arange(-1, 2) % 3
j = np.arange(1, 4) % 3

a = np.random.randint(1,10,(3,3,2))

print a[i,j,:]
# Gives 3 entries [(i[0],j[0]), (i[1],j[1]), (i[2],j[2])]
# This is not what I want...

indices = list(product(i, j))
print indices

indices = zip(*indices)

print 'a[indices]\n', a[indices]
# This works, but when I'm explicit:
print 'a[indices, :]\n', a[indices, :]
# Huh?

3 个答案:

答案 0 :(得分:3)

问题是如果出现advanced indexing

  

选择对象 obj ,是一个至少有一个序列对象或ndarray的元组

您的案例中最简单的解决方法是使用重复索引:

a[i][:, j]

另一种方法是使用ndarray.take,如果您指定mode='wrap',它将为您执行模运算:

a.take(np.arange(-1, 2), axis=0, mode='wrap').take(np.arange(1, 4), axis=1, mode='wrap')

答案 1 :(得分:3)

提供另一种高级索引方法,我认为product解决方案更好。

如果每个维度都有一个整数数组,它们会一起广播,输出与广播形状的输出相同(你会看到我的意思)......

i, j = np.ix_(i,j) # this adds extra empty axes

print i,j 

print a[i,j]
# and now you will actually *not* be surprised:
print a[i,j,:]

请注意,这是一个3x3x2阵列,而你有一个9x2阵列,但简单的重塑将解决这个问题,3x3x2阵列实际上更接近你想要的。

实际上,惊喜仍然隐藏在某种方式中,因为在您的示例中,a[indices]a[indices[0], indicies[1]]相同,但a[indicies,:]a[(indicies[0], indicies[1]),:],这并不是一个惊喜那不一样。请注意,a[indicies[0], indicies[1],:]确实会产生相同的结果。

答案 2 :(得分:1)

请参阅:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing

添加:时,您正在混合整数索引和切片。规则相当复杂,并且比我在上面的链接中解释得更好。