我可以通過對字符串列表的開始包含字符串數組;注意S4
D型:
In [690]: data=np.array([['1','0','7.23','two'],['2','3','1.32','four']])
In [691]: data
Out[691]:
array([['1', '0', '7.23', 'two'],
['2', '3', '1.32', 'four']],
dtype='|S4')
它更可能通過讀取CSV文件,這樣一種陣列創建。
我也可以認爲它是單字節字符串數組 - 的形狀和D型細胞發生了變化,但對應於DataBuffer是相同的(相同的32個字節)
In [692]: data.view('S1')
Out[692]:
array([['1', '', '', '', '0', '', '', '', '7', '.', '2', '3', 't', 'w',
'o', ''],
['2', '', '', '', '3', '', '', '', '1', '.', '3', '2', 'f', 'o',
'u', 'r']],
dtype='|S1')
事實上,我可以改變單個字節,改變原始數組的two
到twos
:
In [693]: data.view('S1')[0,-1]='s'
In [694]: data
Out[694]:
array([['1', '0', '7.23', 'twos'],
['2', '3', '1.32', 'four']],
dtype='|S4')
但是,如果我嘗試的data
的元素改變爲一個整數,它被轉換成一個字符串匹配S4 D型:
In [695]: data[1,0]=4
In [696]: data
Out[696]:
array([['1', '0', '7.23', 'twos'],
['4', '3', '1.32', 'four']],
dtype='|S4')
如果數字來自int(data[1,0])
或者其中的一些變化,也會發生同樣的情況。
但我可以欺騙成看到整數作爲字節串(表示爲\x04
)
In [704]: data[1,0]=np.array(4).view('S4')
In [705]: data
Out[705]:
array([['1', '0', '7.23', 'twos'],
['\x04', '3', '1.32', 'four']],
dtype='|S4')
陣列可以共享數據緩衝器。 data
屬性是指向一塊內存的指針。數組的dtype
控制着該塊的解釋方式。例如,我可以讓整數的另一個數組,並重定向它的data
屬性:
In [714]: d2=np.zeros((2,4),dtype=int)
In [715]: d2
Out[715]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
In [716]: d2.data=data.data # change the data pointer
In [717]: d2
Out[717]:
array([[ 49, 48, 858926647, 1936684916],
[ 4, 51, 842214961, 1920298854]])
現在d2[1,0]
是整數4,但其他項目不可識別的,因爲他們被視爲整數字符串。這與通過int()
函數傳遞它們不一樣。
我不建議將data
這樣的指針改爲常規操作。搞砸事情很容易。我必須注意確保d2.nbytes
爲32,與data
相同。
因爲緩衝區是分片,的變化,以d2
也出現在data
(但顯示的根據不同的D型):
In [718]: d2[0,0]=3
In [719]: data
Out[719]:
array([['\x03', '0', '7.23', 'twos'],
['\x04', '3', '1.32', 'four']],
dtype='|S4')
具有複雜D型的視圖做類似的東西:
In [723]: data.view('i4,i4,f,|S4')
Out[723]:
array([[(3, 48, 4.148588672592268e-08, 'twos')],
[(4, 51, 1.042967401332362e-08, 'four')]],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', 'S4')])
注意48
和51
也出現在d2
。下一個float
列無法識別。
這給出了一個想法,可以和不可以做'就地'。
但是爲了以有意義的方式獲取包含數字和字符串的數組,我最好構造一個新的結構化數組。也許最乾淨的方式是使用中間元組列表。
In [759]: dl=[tuple(i) for i in data.tolist()]
In [760]: dl
Out[760]: [('1', '0', '7.23', 'two'), ('2', '3', '1.32', 'four')]
In [761]: np.array(dl,dtype='i4,i4,f,|S4')
Out[761]:
array([(1, 0, 7.230000019073486, 'two'), (2, 3, 1.3200000524520874, 'four')],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', 'S4')])
所有這些字段佔用4個字節,所以nbytes
是相同的。但個人價值觀已通過轉換器。我已經給出'np.array'自由轉換值,這與輸入和新的dtype一致。這比嘗試執行某種複雜的就地轉換要容易得多。
名單與數字和字符串的混合元組也會工作:
[(1, 0, 7.23, 'two'), (2, 3, 1.32, 'four')]
結構陣列將顯示一個元組列表。在結構化數組文檔中,值總是以元組列表的形式輸入。
recarray
也可以使用,但本質上這只是一個數組子類,它允許您以字段的形式訪問字段。
如果原始數組是從csv文件生成的,那麼使用np.genfromtxt
(或loadtxt
)和適當的選項會更好。它可以生成適當的元組列表,並直接返回結構化數組。
你的意思是複述http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html? –
'['''''''''''','7.25'''''''']'從哪裏來的呢? –
'data'的形狀和dtype是什麼? – hpaulj