2017-07-19 85 views
0

所以我有一個數組是(10,3)類型爲i4。我希望將數據轉換爲3個不同的字符串數組,但我遇到了數組的2d版本的問題。將dtype i4轉換爲dtype s4的問題

import numpy 
xyz = (100.0*numpy.random.random((10,3))).astype("i4") 
A = xyz[:,0:3].view("S12") #works fine 
B = xyz[:,0:2].view("S8") #fails 
C = xyz[:,0:1].view("S4") #works fine 

D = xyz[0,0:2].view("S8") #works fine using only 1 element instead of whole array 

爲什麼我不可能轉換爲一般形式:

xyz[:,0:dim].view("S%d"%(4*dim)) 

不管選擇朦朧的?

回答

1
xyz[:,:2].copy().view('S8') 

工程。

隨着[:,:2]你正在查看2個數字(4字節塊),跳過1,查看下2等。這是一個視圖,而不是副本,因爲步幅和形狀可以處理,而無需更改底層數據。

但是,如果您嘗試在8個字節塊中查看相同的東西,則步幅無法處理它。它需要查看1個塊,跳過1/2個塊等。

通過複製,這8個字節塊是連續的,並且可以被視爲一個單元。

numpy.array(xyz[:,0:2].tostring())實際上是一個副本 - 將數據(只是:2列)寫入一個字節串,然後重新創建一個數組。

+0

因此,[:,3]和[:,:1]的工作原因是它查看整個區塊,或查看1並跳過2?沒有奇怪的半塊參與? – Eric

0

所以我做了一些實驗和它看起來像我找到的東西,始終如一地努力:

numpy.array(xyz[:,0:2].tostring()).view("10S8").reshape(10,1) 

我不是超級抽到使用它,因爲它很奇怪的前瞻性,但它的作品所以無論我猜。如果有人有更好的答案,讓我知道。