![](/img/trans.png)
[英]How to resolve type errors while creating arrays with custom dtypes in 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.