2014-02-09 86 views
1

這是我第一個關於stackoverflow的問題。到目前爲止,我的所有問題都已經被問到,但即使經過很多研究,我也找不到答案。所以在這裏:包含字符串和數字的ndarrays上的Numpy操作

我想在numpy數組中進行數學運算,爲此我鑄造了一個dtype。這在R中是微不足道的,但在python中很複雜。

import numpy as np 
from StringIO import StringIO 
test = "a,1,2\nb,3,4" 
data = np.genfromtxt(StringIO(test), delimiter=",", dtype=None) 

這給了我:

print data 
#array([('a', 1, 2), ('b', 3, 4)], 
#  dtype=[('f0', '|S1'), ('f1', '<i8'), ('f2', '<i8')]) 

不過,如果我嘗試對數據的數值子集執行任何數學運算,我得到錯誤信息:

subData = data[['f1','f2']] 
print subData 
# [(1, 2) (3, 4)] 
subData+1 
#TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'int' 

甚至:

subData + subData 
#TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray' 

我想出的唯一辦法是不是很優雅或實用的一個,因爲我往往失去了列名和類型,以及作爲原始形狀:

subData.view(int) + 1 

非常感謝提前。

+0

numpy的結構化數組並不是真的適合這種事情。它們是C類結構的數組,而不是「類似電子表格」的數據。處理它的典型方法是將每列保存在一個單獨的數組中。不過,「熊貓」是一個更好的選擇。它意味着「類似電子表格」的數據。 –

回答

1

爲了詳細說明我的評論,結構化數組並不完全是爲了這個。它們是C類結構的數組。它們可以用來保存不同類型的列,但它會很快變得麻煩。它們對某些事情非常有用,但「類似電子表格」的數據不是其中之一。通常情況下,當他們有不同的類型時,您只需將每列存儲爲自己的數組。 (這基本上就是pandas確實是。)

這是因爲結構化陣列陣列,其中列有不同的類型,他們是陣列,其中每個項目是具有不同類型的序列。

如果你確實想所有轉換,但第一欄爲「正常」的二維數組,你會做這樣的事情:

numeric_data = np.c_[[data[col] for col in data.dtype.names[1:]]] 

然而,ROR數據,其中每列是不同類型的,使用pandas要好得多。它意味着用於類似電子表格的數據。

from StringIO import StringIO 
import pandas as pd 

test = "a,1,2\nb,3,4" 
data = pd.read_csv(StringIO(test), header=None) 

print data[[1,2]] + 5 
+0

謝謝喬。我實際上是想避免不得不求助於熊貓。所以我更喜歡第一種選擇:)我仍然覺得很奇怪,我不能做那麼簡單的事情。什麼是結構化數組意味着如果不是這樣? – Diogo

相關問題