对包含字符串和数字的ndarrays进行Numpy操作

时间:2014-02-09 15:58:28

标签: python r numpy multidimensional-array

这是我关于stackoverflow的第一个问题。到目前为止,我的所有问题都已被提出,但即使经过大量研究,我也无法找到答案。所以这里:

我想在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

提前多多感谢。

1 个答案:

答案 0 :(得分:1)

为了详细说明我的评论,结构化数组并不完全适用于此。他们是C类结构的阵列。它们可用于容纳不同类型的列,但它会很快变得麻烦。它们对某些事情非常有用,但是&#34;类似电子表格&#34;数据不是其中之一。通常,您只需将每个列存储为具有不同类型的自己的数组。 (这基本上是pandas所做的。)

这是因为结构化数组不是数组,其中列具有不同的类型,它们是数组,其中每个项是一个具有不同的序列类型。

如果您确实希望将除第一列以外的所有列转换为&#34;正常&#34; 2D数组,您可以这样做:

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