规范化/标准化numpy重新排列

2024-10-17 00:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道规范化/标准化numpy的最佳方法是什么。 为了说明这一点,我指的不是一个数学矩阵,而是一个也有文本列(如标签)的记录数组。

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())

还有更优雅的方法吗?有没有“规范化”或“标准化”之类的方法?


Tags: 方法文本numpynp记录矩阵col数学
2条回答

你用的是什么版本的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

我只是想知道你的数据有什么不同。

有很多方法可以做到这一点,但有些方法比其他方法更干净。

通常,在numpy中,将字符串数据保存在单独的数组中。

(事情比R的数据帧要低级一点。通常,您只需将内容打包到关联的类中,但要将不同的数据类型分开。)

老实说,numpy并没有为处理这种“灵活”的数据类型而优化(尽管它确实可以做到这一点)。像^{}这样的东西为“类似电子表格”的数据提供了更好的接口(而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)

相关问题 更多 >