【问题标题】:numpy.fromstring separated by any whitespacenumpy.fromstring 由任何空格分隔
【发布时间】:2015-10-31 03:51:00
【问题描述】:

我有一个文档¹,其中一个 n 维矩阵存储为:

1 2 3 4
5 6 7 8

9 10 11 12
13 14 15 16

具有存储在元数据中的精确尺寸。 4 和 5 由\n 分隔,not 分隔。然而,numpy.fromstring('1 2\n3 4', sep=" ") 确实 做我想做的事,尽管文档另有说明。我对是否依赖与定义的行为不同的实现犹豫不决。

为什么numpy.fromstring("1 2\n3 4", sep=" ")numpy.fromstring("1 2\n3 4", sep="\n") 给我(期望的)array([ 1., 2., 3., 4.]),是否有更强大的(如:对应于记录/定义的行为)具有相同的效果?


¹该文档是一个 XML 文件,其中树中最低元素的文本表示数字数据。我无法控制这种文件格式。

【问题讨论】:

  • 所以期望的行为是获取单个数组中的所有元素?不作为矩阵?
  • \n 算作 extra whitespace 被忽略。此函数中未提供维度元数据。
  • @AnandSKumar 是的。只要我得到所有元素,我就可以轻松.resize。我正在阅读的文件格式可以包含最大为 7 维的数组,因此无论如何它都会被展平超过 3 维。
  • 我建议您自己将输入分成几行,例如txt.splitlines()。这样你就可以计算空行。此功能仍可用于单独的线路。或者你可以使用[int(x) for x in aline.split(' ')]
  • @hpaulj 当然,两者都有效。

标签: python arrays numpy io


【解决方案1】:

如果你得到的是你想要的(意思是 array([ 1., 2., 3., 4.]) 是期望的行为),那么我相信这在 numpy.fromstring 的文档中进行了解释,参数部分 sep -

sep : str,可选

如果未提供或等效地为空字符串,则数据将被解释为二进制数据;否则,作为带有十进制数字的 ASCII 文本。同样在后一种情况下,此参数被解释为数据中分隔数字的字符串; 元素之间的额外空格也会被忽略。

(强调我的)

\n 在这种情况下被认为是额外的空格,因此它被忽略了。请注意,忽略并不意味着它之前和之后的元素成为一个单独的元素,它们仍然是单独的数字。 \t 的类似示例。

In [16]: np.fromstring('1\t2\t3\t4', sep=" ")
Out[16]: array([ 1.,  2.,  3.,  4.])

【讨论】:

  • 是的,\n\t额外的空格,但 fromstring12 之间拆分,即使所需的分隔符 ' ' 根本不会发生。因此,我感到惊讶。我决定暂时依赖这个,假设 numpy 的人不会突然决定改变这种行为。
  • 我不认为他们会改变这种行为,我认为根据文档它的行为是正确的,当您将space 作为分隔符时,额外的空格(包括\n 被视为单个空格.
  • 我会将 extra whitespace 解释为至少 1 倍分隔符后跟空格,而不是 0 倍分隔符后跟空格。不过,我同意你说你认为他们不会改变这种行为。
  • 如果您对此感到不舒服,可以尝试使用 numpy.loadtxt ,它会单独处理换行符,并将 '1 2\n3 4 转换为 [[1,2],[3,4]]
  • 它看起来像对待'','\n','\t',即所有的空白,相同,包括它如何解释参数。基本上,它的目的是加载一长串数字,而不是漂亮的打印数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多