2016-04-03 43 views
1

我有一個列表,名爲test,有3列,每列有891個元素,每個元素都是一對浮點數。 我想創建一個3列的numpy矩陣,每列有891個元素,每個元素都是來自這對浮點數的第一個入口。從python列表中獲取正確的元素

我有以下代碼:

x = [] 
y = [] 
for i in range(len(test)): 
    for j in range(len(test[0])): 
     y.append(test[i][j][0]) 
    x.append(y) 
    y = [] 

tt = numpy.matrix(x) 

這工作,但我可以把它寫在一個更高效,更優雅的方式?

編輯: 例子:

[0.5, 0.5],[0.3, 0.4],[0.1, 0.4] 
[0.7, 0.6],[0.1, 0.4],[0.2, 0.3] 
[0.2, 0.5],[0.6, 0.9],[0.3, 0.2] 
[0.2, 0.5],[0.6, 0.9],[0.4, 0.1] 

我想:Python中的

[0.5, 0.3, 0.1] 
[0.7, 0.1, 0.2] 
[0.2, 0.6, 0.3] 
[0.2, 0.6, 0.4] 
+0

@ Dex'ter謝謝。即使是像這樣的小代碼片段,codereview也可以嗎?我看着它,它們看起來都比這更精緻。在那種情況下,我應該刪除這個問題並在那裏重新發布嗎? – user

+0

你可以在那裏發佈這個代碼,一些測試用例和一個示例文件。我相信你會在那裏找到一些好點。 – 2016-04-03 08:54:20

+1

不知道這是否是你想要的,但你可以嘗試:'np.matrix(np.array(test)[...,0] .squeeze()。T)'。 – Divakar

回答

0

兩個特點來學習:iterables和發電機表達式。

您沒有提供任何示例數據,因此我們無法驗證我們看到的是與您相同的行爲。總是最好放在你的問題a minimal, complete, verifiable example爲我們執行。

更好的是,如果的名稱比或test更具描述的意圖。

test = [ 
    [2, 4, 6], 
    [3, 6, 9], 
    [4, 8, 2], 
    ] 
import numpy 

rows = [] 
cells = [] 
for test_row in test: 
    for column in test_row: 
     cells.append(column) 
    rows.append(cells) 
    cells = [] 

tt = numpy.matrix(rows) 
  • 不是一次追加的項目之一,喜歡list comprehension,如果它有助於可讀性:
import numpy 

rows = [ 
    [column for column in row] 
    for row in test] 

tt = numpy.matrix(rows) 

有時候(並非在這種情況下)你甚至不需要列表一次存在;你只需要遍歷這些項目,然後丟棄該序列。然後生成器表達更好;當你有時間時看看那個。

請注意將這些視爲提高可讀性的選項。它們並不總是合適的,有時它們會讓你的代碼太密集且難以閱讀。

+0

感謝您的指導。我按照你的建議添加了這個例子。 – user

1
x = np.asarray(test)[:, :, 0] 

就這麼簡單。有人可能會認爲它不如內存效率高,因爲你至少暫時還在儲存你不感興趣的元素;但無論如何,這與你嵌套的python數據結構的內存使用情況有些相似。