如何将列添加到ndarray?

时间:2013-02-13 06:25:27

标签: python matrix numpy concat

所以我有以下代码读取文件并使用genfromtxt给我一个ndarray:

arr = np.genfromtxt(filename, delimiter=',', converters={'Date': make_date},
                    names=('Date', 'Name','Age'), dtype=None)

现在,我希望在arr中添加另一个名为“Marks”的列。你能帮我解决一下我是怎么做到的吗?

2 个答案:

答案 0 :(得分:7)

np.genfromtxt生成记录数组。列不能以通常的numpy方式连接到记录数组。使用numpy.lib.recfunctions.append_fields

import numpy as np
from numpy.lib import recfunctions as rfn
from StringIO import StringIO

s = StringIO('2012-12-10,Peter,30\n2010-01-13,Mary,31')
arr = np.genfromtxt(s, delimiter=',', names=('Date', 'Name','Age'), dtype=None)
new_arr = rfn.append_fields(arr, names='Marks', data=['A','C+'], usemask=False)

返回:

>>> arr
array([('2012-12-10', 'Peter', 30), ('2010-01-13', 'Mary', 31)], 
  dtype=[('Date', '|S10'), ('Name', '|S5'), ('Age', '<i8')])
>>> new_arr
array([('2012-12-10', 'Peter', 30, 'A'), ('2010-01-13', 'Mary', 31, 'C+')], 
  dtype=[('Date', '|S10'), ('Name', '|S5'), ('Age', '<i8'), ('Marks', '|S2')])

答案 1 :(得分:2)

您可以使用hstack向ndarray添加列,例如

>>> a = np.eye(3)
>>> a
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
>>> a = np.hstack([a, np.array(range(3)).reshape(3,1)])
>>> a
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  1.],
       [ 0.,  0.,  1.,  2.]])

还有快捷索引技巧c_,可以自动处理重塑:

>>> np.c_[a, np.ones(3)]
array([[ 1.,  0.,  0.,  1.],
       [ 0.,  1.,  1.,  1.],
       [ 0.,  0.,  2.,  1.]])