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

我想在我为其强制转换为dtype的numpy数组中进行数学运算。这在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


非常感谢。

最佳答案

只是为了详细说明我的观点,结构化数组并不完全适合此目的。它们是类似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,2\nb,3,4"
data = pd.read_csv(StringIO(test), header=None)

print data[[1,2]] + 5

关于python - 包含字符串和数字的ndarray上的Numpy操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21661308/

10-11 03:55