簡體   English   中英

規范化/標准化numpy重新排列

[英]Normalize/Standardize a numpy recarray

我想知道正常化/標准化numpy recarray的最佳方法是什么。 為了說清楚,我不是在談論一個數學矩陣,而是一個記錄數組,它也有例如文本列(如標簽)。

a = np.genfromtxt("iris.csv", delimiter=",", dtype=None)
print a.shape
> (150,)

如你所見,我無法處理a[:,:-1]因為形狀是一維的。

我找到的最好的是迭代所有列:

for nam in a.dtype.names[:-1]:
    col = a[nam]
    a[nam] = (col - col.min()) / (col.max() - col.min())

這樣做更優雅的方式? 是否有某些方法,如“標准化”或“標准化”?

有很多方法可以做到,但有些方法比其他方法更清潔。

通常,在numpy中,將字符串數據保存在單獨的數組中。

(事情比R的數據框架要低一些。你通常只是在一個類中包裝用於關聯,但是將不同的數據類型分開。)

老實說,numpy沒有針對處理這種“靈活”數據類型進行優化(雖然它當然可以做到)。 pandas這樣的東西為“類似電子表格”的數據提供了更好的界面(而pandas只是numpy之上的一層)。

但是,當您傳入字段名稱列表時,結構化數組(這是您在此處擁有的)將允許您按列進行切片。 (例如data[['col1', 'col2', 'col3']]

無論如何,一種方法是做這樣的事情:

import numpy as np

data = np.recfromcsv('iris.csv')

# In this case, it's just all but the last, but we could be more general
# This must be a list and not a tuple, though.
float_fields = list(data.dtype.names[:-1])

float_dat = data[float_fields]

# Now we just need to view it as a "regular" 2D array...
float_dat = float_dat.view(np.float).reshape((data.size, -1))

# And we can normalize columns as usual.
normalized = (float_dat - float_dat.min(axis=0)) / float_dat.ptp(axis=0)

然而,這遠非理想。 如果你想就地進行操作(就像你現在的那樣),最簡單的解決方案就是你已經擁有的:只需迭代字段名稱即可。

順便說一句,使用pandas ,你會做這樣的事情:

import pandas
data = pandas.read_csv('iris.csv', header=None)

float_dat = data[data.columns[:-1]]
dmin, dmax = float_dat.min(axis=0), float_dat.max(axis=0)

data[data.columns[:-1]] = (float_dat - dmin) / (dmax - dmin)

您使用的是哪種版本的NumPy? 在1.5.1版本中,我沒有得到這種行為。 我以一個簡短的文本文件為例,保存為test.txt

last,first,country,state,zip
tyson,mike,USA,Nevada,89146
brady,tom,USA,Massachusetts,02035

當我執行以下代碼時,這就是我得到的:

>>> import numpy as np
>>> a = np.genfromtxt("/home/ely/Desktop/Python/test.txt",delimiter=',',dtype=None)
>>> print a.shape
(3,5)
>>> print a
[['last' 'first' 'country' 'state' 'zip']
 ['tyson' 'mike' 'USA' 'Nevada' '89146']
 ['brady' 'tom' 'USA' 'Massachusetts' '02035']]
>>> print a[0,:-1]
['last' 'first' 'country' 'state']
>>> print a.dtype.names
None

我只是想知道你的數據有什么不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM