簡體   English   中英

用dtypes創建一個numpy矩陣

[英]Creating a numpy matrix with dtypes

我想創建一個包含三列的numpy矩陣,其中前兩列包含整數,第三列包含浮點數。 我想從一個空矩陣開始,每次在for循環中添加一行。 但是,我無法使它添加到具有特定數據類型的numpy矩陣中。 這是我開始的代碼:

import numpy as np

def grow_table():
    dat_dtype = {
        'names' : ['A', 'B', 'C'],
        'formats' : ['i', 'i', 'd']}
    S = np.zeros(0, dat_dtype) 

    X = np.array([1, 2, 3.5], dat_dtype)    
    S = np.vstack((S, X))

if __name__ == '__main__':
    grow_table()

但是,這給出了TypeError: expected a readable buffer object

然后,我將定義行的行更改如下:

X = np.array((1, 2, 3.5), dat_dtype)

此行被接受。 但是,現在X是一個元組。 如果我嘗試print X[0] ,那么我將遇到IndexError: 0-d arrays can't be indexed 此外,我無法將X添加到S ,這將給我帶來ValueError: all the input array dimensions except for the concatenation axis must match exactly

接下來,我從數據類型中刪除名稱; 在這種情況下,我最終遇到ValueError: entry not a 2- or 3- tuple

我是在解決這個問題的正確軌道上,還是應該嘗試完全不同的嘗試?

我不是Hybrid dtype的忠實擁護者,可以使用單獨的數組,字典中的數組或pandas數據幀。 無論如何,這是您可以執行的操作:

X = np.array([(1, 2, 3.5)], dat_dtype)
S = np.vstack((S[:,None], X, X, X))

每次迭代重新堆棧通常很慢,您最好制作一個1行數組的列表並在末尾進行vstack-ing,或者創建具有已知大小的數組並分配給元素。

我不喜歡逐漸增加陣列,但是這是一種方法:

import numpy as np

def grow_table():
    dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
    S = np.zeros(0, dtype=dt)
    for i in range(5):
        X = np.array((i, 2*i, i+.5), dtype=dt)
        S = np.hstack((S, X))
    return S

if __name__ == '__main__':
    S  = grow_table()
    print S
    print S['A']

生產:

[(0, 0, 0.5) (1, 2, 1.5) (2, 4, 2.5) (3, 6, 3.5) (4, 8, 4.5)]
[0 1 2 3 4]

S從形狀(0,) X具有形狀() ; 它是0d。 最后, S具有形狀(5,) 我們必須使用hstack因為我們正在創建一個1d數組。 一個元組數組。 這就是使用dtype所獲得的。 同樣,當向這樣的數組分配值時,這些值也必須位於一個元組中,而不是一個列表中。

更好的增量構建是:

def make_table(N=5):
    dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
    S = np.zeros(N, dtype=dt)
    for i in range(N):
        S[i] = (i, 2*i, i+.5)
    return S

甚至使用元組列表:

def better(N=5):
    dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
    L = [(i, 2*i, i+.5) for i in range(N)]
    return np.array(L, dtype=dt)

對於csv輸出:

S = better()
np.savetxt('S.txt', S, fmt='%d, %d, %f')

生產:

0, 0, 0.500000
1, 2, 1.500000
...

嘗試savetxt (N,1)數組會產生一個或多個錯誤。

savetxt嘗試寫

 for row in S:
     write(fmt%row)

對於(N,)數組, row(0, 0, 0.5) ,但是對於(N,1)它是[(0, 0, 0.5)]

np.savetxt('S.txt', S, fmt='%s') 

作品,生產

(0, 0, 0.5)
(1, 2, 1.5)
...

但是,如果您只想保存2列int和1個浮點數,則不需要此dtype 只需讓fmt完成所有工作即可:

def simple(N=5):
    return np.array([(i, 2*i, i+.5) for i in range(N)])
S = simple()
np.savetxt('S.txt',S, fmt='%d, %d, %f')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM