經常出現如何處理來自genfromtxt
的混合數據的問題。人們期望一個2d數組,而是得到一個他們無法按列索引的1d。那是因爲他們得到了一個結構化數組 - 每列有不同的dtype。
>>> s = StringIO("1,1.3,abcde")
>>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
... ('mystring','S5')], delimiter=",")
>>> data
array((1, 1.3, 'abcde'),
dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', '|S5')])
但讓我演示瞭如何訪問這種數據
In [361]: txt=b"""A, 1,2,3
...: B,4,5,6
...: """
In [362]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=('S1,int,float,int'))
In [363]: data
Out[363]:
array([(b'A', 1, 2.0, 3), (b'B', 4, 5.0, 6)],
dtype=[('f0', 'S1'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<i4')])
所以我的陣列有2條(檢查形狀):
所有在genfromtxt
文檔顯示這樣的例子,它們在列表中顯示爲元組。
您可以通過名稱訪問fields
,不列號(做我需要添加一個結構化的陣列文檔鏈接?)
In [364]: data['f0']
Out[364]:
array([b'A', b'B'],
dtype='|S1')
In [365]: data['f1']
Out[365]: array([1, 4])
在這樣的情況下,如果我選擇了dtype
可能更爲有用「子陣。這是一個更先進的D型話題
In [367]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=('S1,(3)float'))
In [368]: data
Out[368]:
array([(b'A', [1.0, 2.0, 3.0]), (b'B', [4.0, 5.0, 6.0])],
dtype=[('f0', 'S1'), ('f1', '<f8', (3,))])
In [369]: data['f1']
Out[369]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
字符列仍然加載S1
,但現在的數字是在3列陣列。請注意,它們都是float(或int)。
In [371]: from scipy import stats
In [372]: stats.describe(data['f1'])
Out[372]: DescribeResult(nobs=2,
minmax=(array([ 1., 2., 3.]), array([ 4., 5., 6.])),
mean=array([ 2.5, 3.5, 4.5]),
variance=array([ 4.5, 4.5, 4.5]),
skewness=array([ 0., 0., 0.]),
kurtosis=array([-2., -2., -2.]))
我想這個錯誤是因爲在你的數組中有多個'dtype'。特別是字符串在統計學上會有問題。也許你可以循環遍歷每一列,並分別描述列? –
感謝您的回答。我怎樣才能訪問,例如,數組的第二列?我嘗試過'stats.describe(dataset [2])',但它產生的錯誤和我的OP一樣。 – beta
我懷疑我的陣列可能有問題嗎?基於CSV文件的適當numpy數組應該如何顯示?我看起來像這樣,如果我打印它:http://pastebin.com/MYyqbSG0 – beta