2015-05-18 143 views
-2

可以使用numpy生成重複的索引模式,例如。有沒有辦法使用numpy生成索引列表

0,1,2,3,4,5,0,6,7,8,9,10,0,11,12,13,14,15

0,1,2,1,2,3,4,5,6,5,6,7

是否有numpy的一種方法,我可以用它來生成一系列之間這些名單?

目前我正在使用Python中的列表,但我很好奇,如果我可以使用numpy來加快速度。

我不知道什麼方法甚至可以查看其他比numpy.arange。

只是爲了進一步闡明我正在以各種模式在opengl中爲三角形生成索引。

因此對於一個圓形的泛光燈我有這樣的代碼。

for fan_set in range(0, len(self.vertices)/vertex_length, triangle_count): 
     for i in range(fan_set + 1, fan_set + 8): 
      self.indices.append(fan_set) 
      self.indices.append(i) 
      self.indices.append(i + 1) 
+0

第二個例子沒什麼意義,你能解釋一下嗎? –

+0

您是否遇到過比(x)範圍更快的需求?有一些東西,比如linspace和mgrid,你可能會屈從於你的目的,但我認爲它們不會比使用xrange快得多。 –

+0

另外,如果你能告訴我們你現在有什麼(你說你當前正在使用python列表),我們可能會給你一些加速的提示。 –

回答

0

你的第一個例子可以通過numpy的方法來製備:

In [860]: np.concatenate((np.zeros((3,1),int),np.arange(1,16).reshape(3,5)),axis=1).ravel() 
Out[860]: 
array([ 0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 0, 11, 12, 13, 14, 
     15]) 

這是因爲我看到這個2D重複圖案

array([[ 0, 1, 2, 3, 4, 5], 
     [ 0, 6, 7, 8, 9, 10], 
     [ 0, 11, 12, 13, 14, 15]]) 

第二圖案可以通過該2D陣列的ravel(產生通過廣播2陣列產生):

In [863]: np.array([0,1,4,5])[:,None]+np.arange(3) 
Out[863]: 
array([[0, 1, 2], 
     [1, 2, 3], 
     [4, 5, 6], 
     [5, 6, 7]]) 

我可以生產與2號的變化第一個模式中(0初始柱破壞模式)

I=np.array([0,5,10])[:,None]+np.arange(0,6) 
I[:,0]=0 

我想你的雙迴路可以表示爲一個列表理解爲

In [872]: np.array([ [k,i,i+1] for k in range(0,1,1) for i in range(k+1,k+8)]).ravel() 
Out[872]: array([0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8]) 

或不拉威爾:

array([[0, 1, 2], 
     [0, 2, 3], 
     [0, 3, 4], 
     [0, 4, 5], 
     [0, 5, 6], 
     [0, 6, 7], 
     [0, 7, 8]]) 

雖然我不知道什麼參數產生你的例子。

+0

多數民衆贊成我認爲可能有一些簡單的numpy,但這是我在一個numpy解決方案後。這也給了我一個研究各種方法的方向。 – Oly

0

我不知道我明白你的意思到底是什麼,但下面是我用它來生成3D點唯一索引;

def indexate(points): 
    """ 
    Convert a numpy array of points into a list of indices and an array of 
    unique points. 

    Arguments: 
     points: A numpy array of shape (N, 3). 

    Returns: 
     An array of indices and an (M, 3) array of unique points. 
    """ 
    pd = {} 
    indices = [pd.setdefault(tuple(p), len(pd)) for p in points] 
    pt = sorted([(v, k) for k, v in pd.items()], key=lambda x: x[0]) 
    unique = np.array([i[1] for i in pt]) 
    return np.array(indices, np.uint16), unique 

你可以找到自己stltools包GitHub上this code

它的工作原理是這樣的;

In [1]: import numpy as np 

In [2]: points = np.array([[1,0,0], [0,0,1], [1,0,0], [0,1,0]]) 

In [3]: pd = {} 

In [4]: indices = [pd.setdefault(tuple(p), len(pd)) for p in points] 

In [5]: indices 
Out[5]: [0, 1, 0, 2] 

In [6]: pt = sorted([(v, k) for k, v in pd.items()], key=lambda x: x[0]) 

In [7]: pt 
Out[7]: [(0, (1, 0, 0)), (1, (0, 0, 1)), (2, (0, 1, 0))] 

In [8]: unique = np.array([i[1] for i in pt]) 

In [9]: unique 
Out[9]: 
array([[1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0]]) 

的關鍵點(如果你能原諒這個雙關語)是使用點的元組(因爲一個元組是不可變的,因此可哈希)作爲與setdefault方法的字典中的關鍵,而dict的長度是值。實際上,這個值是第一次看到這個點。

+0

這就是我以後的事情,但不是按順序排列,而是按重複順序排列,但不是一個接一個地排列,因爲它會重複索引和分數。你也可以使用np.arrange,如果你按照這種方式排列它們,可以跳過生成列表。 – Oly

+0

@Oly很抱歉,我無法理解您的評論。此代碼將唯一點的列表和唯一點的索引數組返回到唯一點的數組中。 –

+0

史密斯我的壞我沒有完全理解它,我覺得它有點混亂,因爲它使用的字符串元組和數組,不錯的例子,但不是我想要的。 – Oly

0

我不是100%肯定這是你以後,我覺得你可以實現使用對range值這一點,並增加n次3(每組之間的間隔),然後用numpy.concatenate來連接最終陣列,像這樣:

import numpy as np 

def gen_list(n): 
    return np.concatenate([np.array(range(i, i+3) + range(i+1, i+4)) + i*3 
          for i in xrange(n)]) 

用法:

gen_list(2) 
Out[16]: array([0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7]) 

gen_list(3) 
Out[17]: 
array([ 0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 9, 10, 9, 10, 
     11]) 

list(gen_list(2)) 
Out[18]: [0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7] 

在我的示例我只用n只要你想多少組生成,您可以將其更改爲適合您的三角形上下的requiremen TS。

+0

感謝這個例子,它是一種有趣的方式,我會對它進行一些研究,然後仔細研究一下,因爲我對這種方法不太瞭解。 – Oly

+0

@Oly,是的,有一個遊戲,我希望這會有所幫助,'numpy.concatenate'基本上是連接一個數組序列。 – Anzel

相關問題