我正在尝试从数组返回一个(方形)部分,其中索引环绕边缘。我需要处理一些索引,但是它有效,但是,我希望最后两行代码具有相同的结果,为什么不呢? 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?
答案 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
添加:
时,您正在混合整数索引和切片。规则相当复杂,并且比我在上面的链接中解释得更好。