2017-10-18 37 views
0

最近我遇到了一些我不太明白的Numpy練習。練習以3D陣列使用一些隨機樣本數據:什麼時候是:相當於Numpy中的完整索引向量?

import numpy as np 

alpha = np.full(2000, .1) 
beta = np.full(100, .1) 

wordsInTopic = np.random.dirichlet(alpha, 100) 

produced = np.zeros((50, 100, 2000)) 

for doc in range(0, 50): 

    topicsInDoc = np.random.dirichlet(beta) 
    wordsToTopic = np.random.multinomial(2000, topicsInDoc) 

    for topic in range(0, 100): 
     produced[doc, topic] = np.random.multinomial(wordsToTopic[topic], wordsInTopic[topic]) 

例如下面是等價的,因爲預期:

print(produced[:, np.arange(0, 100, 1), :].shape) 
print(produced[:, :, :].shape) 

但以下是不:

print(produced[:, np.arange(0, 100, 1), produced.sum(0).argmax(1)].shape) 
print(produced[:, :, produced.sum(0).argmax(1)].shape) 

有人能解釋這裏發生了什麼嗎?

+0

':'指定沿軸的每個索引,就這些了。 –

+0

您正在觸發前者的高級索引。去谷歌上查詢。 – Divakar

回答

1

總之,:基本上說「選擇這個軸的所有內容」,同時傳遞一個索引列表「從這個軸選擇給定的索引」。

當您只有一個索引列表時,兩者可以是等效的。它很容易看到一個小的,二維矩陣:

>>> X = np.random.randint(0, 10, size=(3, 3)) 
>>> X 
array([[2, 4, 8], 
     [0, 6, 9], 
     [4, 2, 5]]) 
>>> X[:, :] 
array([[2, 4, 8], 
     [0, 6, 9], 
     [4, 2, 5]]) 
>>> X[:, [0, 1, 2]] 
array([[2, 4, 8], 
     [0, 6, 9], 
     [4, 2, 5]]) 

這樣纔有意義。現在,當您使用兩個索引列表時,numpy的語義表明這些索引是成對匹配的(或者更一般地說,它們一起廣播)。考慮以下幾點:

>>> X[[0, 1, 2], [0, 1, 2]] 
array([2, 6, 5]) 

它返回(0, 0)元素,該元素(1, 1)(2, 2)元素。這種索引(您通過索引列表)被稱爲花式索引,並且可以非常強大。你可以閱讀更多花哨的索引,並看到一些例子,here(完全披露:這個鏈接到我自己的網站)。

相關問題