我一直在使用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阵列
显然我在这里误解了什么,我哪里出错?
答案 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_