如何从一块字符串中创建一个二维numpy数组

4

使用列表推导式,我可以将以字符串格式表示的20x20数字块转换为整数列表的列表。数字由空格分隔,行由换行符分隔。

grid = [[int(x) for x in line.split()] for line in nums.split('\n')]

然而,我想要使用NumPy来提高速度。我可以使用np.asarray()和我的中间列表一起使用,但我认为这不是有效利用NumPy。

我还尝试使用np.fromstring(),但我无法找到适用于二维数组的逻辑。

有没有办法在不创建Python中间列表的情况下完成这个任务?


numpy中的csv加载器loadtxtgenfromtxt的操作方式与您一样 - 逐行读取并从中制作一个列表。然后在最后从中创建一个数组。对于小型(更小)的数组,我们一直使用np.array(list_of_lists) - hpaulj
2个回答

5
您可以使用np.fromstring,将空格设置为分隔符,并使用reshape来调整所需形状:
np.fromstring(s, sep=' ').reshape(20, 20)

或者作为更一般的解决方案:
rows = s.count('\n') + 1
np.fromstring(s, sep=' ').reshape(-1, rows)

2
太好了!我担心它处理不了换行符,但它似乎忽略了它们。 - rocksNwaves

3

更通用的针对任何二维网格:

rows = s.count('\n') + 1
np.fromstring(s, sep=' ').reshape(rows, -1)

“-1”参数是什么意思?我在文档中找不到它的用法。 - rocksNwaves
1
这意味着我们希望numpy计算所需的维度。例如,如果您有一个形状为(3,4)的2D数组x,并且执行x.reshape(-1),那么您将获得一个大小为12的1D数组(numpy会计算出它应该包含3x4 = 12个元素)。 - Mohammad Zeineldeen
@rocksNwaves 之前是错误的,因为行和列被颠倒了。现在已经正确了。 - Mohammad Zeineldeen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接