Hadoop 流式传输创建 numpy 数组的最快方法
Hadoop streaming fastest way to creat a numpy array
我的映射器的输入是一个 txt 文件,其中每一行对我来说都是一个向量。
我想创建一个 numpy 数组,其中每一行都是那个向量。
例如:如果我的文本文件是:
1 2 3
9 5 7
我想要一个 numpy 数组:
a=np.array([[1,2,3][9,5,7]])
我有(还有其他方法吗..?)来逐行检索,
所以我的问题是:
最好的存储方式是什么,所以我将以最快的方式创建我的数组。
np.loadtxt
(和 np.genfromtxt
)读取这样的文本文件,并生成您想要的数组。
a = np.loadtxt(filename) # or
a = np.loadtxt(filename, dtype=int)
此函数确实读取每一行,将数字收集到一个列表列表中,最后将其转换为数组。
关于使用这些函数读取 'csv' 文本文件有很多问题。 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.]])
使用不同的列加载 a
和 b
是可行的 - 只要您使用 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.])
虽然我怀疑您真的想从同一组行中填充 a
和 b
。为此,您在加载
后拆分了数组
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.]])
我的映射器的输入是一个 txt 文件,其中每一行对我来说都是一个向量。
我想创建一个 numpy 数组,其中每一行都是那个向量。
例如:如果我的文本文件是:
1 2 3
9 5 7
我想要一个 numpy 数组:
a=np.array([[1,2,3][9,5,7]])
我有(还有其他方法吗..?)来逐行检索,
所以我的问题是:
最好的存储方式是什么,所以我将以最快的方式创建我的数组。
np.loadtxt
(和 np.genfromtxt
)读取这样的文本文件,并生成您想要的数组。
a = np.loadtxt(filename) # or
a = np.loadtxt(filename, dtype=int)
此函数确实读取每一行,将数字收集到一个列表列表中,最后将其转换为数组。
关于使用这些函数读取 'csv' 文本文件有很多问题。 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.]])
使用不同的列加载 a
和 b
是可行的 - 只要您使用 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.])
虽然我怀疑您真的想从同一组行中填充 a
和 b
。为此,您在加载
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.]])