这是我关于stackoverflow的第一个问题。到目前为止,我所有的问题都已经被问过了,但即使经过大量研究,我也无法找到这个问题的答案。所以这里是:
我想在我为其铸造 dtype 的 numpy 数组中进行数学运算。这在R中是微不足道的,但在python中很复杂。
import numpy as np
from StringIO import StringIO
test = "a,1,2nb,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
提前非常感谢。
只是为了详细说明我的评论,结构化数组并不完全是为此而设计的。 它们是类似 C 的结构数组。 它们可用于容纳不同类型的列,但很快就会变得繁琐。 它们对某些事情非常有用,但"类似电子表格"的数据不是其中之一。通常,当每列具有不同的类型时,您只需将每列存储为其自己的数组。(这基本上是pandas
所做的。
这是因为结构化数组不是列具有不同类型的数组,而是每个项目都是具有不同类型的序列的数组。
如果您确实想将除第一列之外的所有列转换为"普通"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,2nb,3,4"
data = pd.read_csv(StringIO(test), header=None)
print data[[1,2]] + 5