高级索引返回一个形状错误的数组

时间:2017-04-10 05:47:12

标签: python arrays numpy

我一直在使用this reference来理解高级索引。一个具体的例子如下;

实施例 假设x.shape是(10,20,30)而ind是(2,3,4)形索引的intp数组,那么result = x [...,ind,:]有形状(10,2,3)因为(20,)形子空间已经被(2,3,4)形的广播索引子空间所取代。如果我们让i,j,k在(2,3,4)形子空间上循环,那么结果[...,i,j,k,:] = x [...,ind [i,j,k] ] ,:]。此示例生成与x.take(ind,axis = -2)相同的结果。

我一直试图理解这一段时间并帮助我,我有一个产生一些数组的小脚本。我有;

Indexing arrays
i => 12 x 25
j => 12 x 25
k => 12 x 1

Input array
x => 2 x 3 x 4 x 4

Output Array
Cols => 2 x 12 x 25

我用来制作Cols的代码如下;

cols = x[:, k, i, j]

根据我对示例的理解,cols实际上应该具有形状(2 x 12 x 1 x 12 x 25 x 12 x 25)。我是这样来的;

原始尺寸为2 x 3 x 4 x 4

2未改变,但所有其他尺寸都改变了

将3替换为k,12 x 1阵列

前4个被i替换,12 x 25阵列

第二个4由j替换,也是12 x 25阵列

显然我在这里误解了什么,我哪里出错?

1 个答案:

答案 0 :(得分:1)

这样做你想要的:

WebDriver driver = new FirefoxDriver();
 JavascriptExecutor js = (JavascriptExecutor)driver;
 jse.executeScript("window.scrollBy(0,200)", "");

为什么原始方法不会那样工作?我认为,在确定您是否同时按多个维度进行索引时,高级索引可能是贪婪的。例如,您的原始形状:

i=np.random.randint(0,4,(12,25))
j=np.random.randint(0,4,(12,25))
k=np.random.randint(0,3,(12,1))
x=np.random.randint(1,11,(2,3,4,4))

x1 = x[:,k,:,:][:,:,:,i,:][:,:,:,:,:,j]
x1.shape

(2, 12, 1, 12, 25, 12, 25)

可以通过多种方式进行解释。你想要的是每个轴都是独立的,但将其解释为6 x.shape (2,3,4,4) 矩阵或2 (4,4)个张量同样有效。因此,当按(3,4,4)建立索引时,您可以将[...,i,j]解释为超过第三个轴,将i解释为超过第四个轴,或j超过最后两个轴。 Numpy猜测你的意思是第二个:

i,j

您还可以将x[...,i,j].shape (2,3,12,25) 解释为8个x矩阵,这就是您执行此操作时所发生的情况:

(3,4)

请注意,我们还会将您的x[:,k,i,:].shape (2,12,25,4) (12,1)数组广播到k,以便匹配(12,25)进行索引编制。您可以使用i上的.squeeze()确认正在进行广播:

k

如果您将x[:,k.squeeze(),i,:] Traceback (most recent call last): IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (12,) (12,25) 解释为2 x张量,numpy会同时执行这两项操作。它将(3,4,4)广播到k,然后将最后三个维度与一组三个(12,25)索引数组进行索引,将所有这三个数据减少为一个整数。

您可以使用(12,25)稍微覆盖此行为,但np.ix_的所有参数都必须为1d,因此您在没有展平和重塑的情况下运气不佳,这种失败这里的目的,但也有效:

np.ix_