Hadoop流式传输最快的方式来创建一个numpy数组

时间:2015-08-22 17:26:03

标签: hadoop numpy hadoop-streaming

我的mapper输入是一个txt文件,每行都是我的矢量。
我想创建一个numpy数组,其中每一行都是该向量。

例如:如果我的文本文件是:
1 2 3
9 5 7

我想要一个numpy数组:

a=np.array([[1,2,3][9,5,7]])

我有(有另一种方式..?)逐一检索线条, 所以我的问题是:
什么是存储它的最佳方式,所以我将以最快的方式创建我的阵列。

1 个答案:

答案 0 :(得分:1)

np.loadtxt(和np.genfromtxt)读取这样的文本文件,并生成所需的数组。

a = np.loadtxt(filename)   # or
a = np.loadtxt(filename, dtype=int)

此函数读取每一行,将数字收集到列表列表中,最后将其转换为数组。

关于使用这些函数读取'csv'文本文件有很多SO问题。 pandas的版本更快。

loadtxt接受任何行为类似于文件readline的输入 - 也就是说,一次只提供一行的迭代器。

在交互式会话中,我可以定义带有三引号的字符串,将其拆分为行,并将该行列表传递给loadtxt

In [105]: txt="""1 2 3
4 5 6"""
In [106]: txt=txt.splitlines()
In [107]: np.loadtxt(txt, dtype=int)
Out[107]: 
array([[1, 2, 3],
       [4, 5, 6]])

StringIO也可用于此,但您需要一个简单的字符串列表。您也可以使用stdin

In [111]: a=np.loadtxt(sys.stdin)
0 1 2
5 6 7 <ctrlD>

In [112]: a
Out[112]: 
array([[ 0.,  1.,  2.],
       [ 5.,  6.,  7.]])

使用不同的列加载ab可以正常工作 - 只要您使用ctrl D两次。

In [114]: a = np.loadtxt(sys.stdin, usecols=(0,1)); b = np.loadtxt(sys.stdin, usecols=[2])
1 2 3
4 5 6 ^D
2 3 4 5
6 7 8 9 ^D

In [115]: a
Out[115]: 
array([[ 1.,  2.],
       [ 4.,  5.]])

In [116]: b
Out[116]: array([ 4.,  8.])

虽然我怀疑你真的想要从同一组行填充ab。为此,您在加载

后拆分了数组
In [117]: ab = np.loadtxt(sys.stdin)
1 2 3
4 5 6

In [118]: ab
Out[118]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

In [119]: a=ab[:,[0,1]]; b=ab[:,[2]]

In [120]: a
Out[120]: 
array([[ 1.,  2.],
       [ 4.,  5.]])

In [121]: b
Out[121]: 
array([[ 3.],
       [ 6.]])