【问题标题】:How can I expand one axis to 2 axes in NumPy?如何在 NumPy 中将一个轴扩展到 2 个轴?
【发布时间】:2021-09-28 14:42:23
【问题描述】:

假设我有一个任意维度的字符串ndarray。例如:[["abc", "def"], ["ghi", "jkl"]]。现在,我想将每个字符串拆分为单独的字符,以便基本上添加第二维中的轴:[[['a', 'd'], ['b', 'e'], ['c', 'f']], [['g', 'j'], ['h', 'k'], ['i', 'l']]]。或者说得更好,它的行为应该类似于 MATLAB 将字符串数组转换为 char 数组:

A = 
  2×2 string array
    "abc"    "def"
    "ghi"    "jkl"

应该变成:

  2×3×2 char array
ans(:,:,1) =
    'abc'
    'ghi'
ans(:,:,2) =
    'def'
    'jkl'

我尝试了np.frompyfuncnp.apply_over_axisnp.apply_from_axis 之类的功能,但到目前为止对我没有任何帮助。有什么巧妙的技巧可以做到这一点?

反过来其实很简单:

def row_to_string(row):
    return ''.join([chr(int(x)) for x in row])

return np.apply_along_axis(row_to_string, 1, np.asarray(x))

编辑:有关 3D 示例,请参阅此要点:https://gist.github.com/PeterTillema/215f0a6474849a06001e10804e5a6eca

【问题讨论】:

  • 请注意,str.join() 接受生成器作为参数,无需浪费内存创建临时 list"".join(chr(int(x)) for x in row)
  • apply_along_axis 只是一个迭代器;它没有什么神奇之处,尤其是在使用二维数组时。尝试与 apply 等一起使用什么功能。frompyfunc(list,1,1) 为您做什么?

标签: python numpy matlab


【解决方案1】:
In [159]: alist = [["abc", "def"], ["ghi", "jkl"]]
In [160]: np.frompyfunc(list,1,1)(alist)
Out[160]: 
array([[list(['a', 'b', 'c']), list(['d', 'e', 'f'])],
       [list(['g', 'h', 'i']), list(['j', 'k', 'l'])]], dtype=object)
In [161]: np.array(np.frompyfunc(list,1,1)(alist).tolist())
Out[161]: 
array([[['a', 'b', 'c'],
        ['d', 'e', 'f']],

       [['g', 'h', 'i'],
        ['j', 'k', 'l']]], dtype='<U1')

您可以从那里转置到所需的布局。

将字符串拆分为字符是一项 python 任务。 Numpy 没有特殊的字符串代码,只有 np.char 函数将字符串方法应用于字符串 dtype 数组的元素。

frompyfunc 是一个方便的工具,用于将 python 函数应用于数组元素。它不编译任何东西,但通常在速度上与列表推导相当,并且可能更方便。

【讨论】:

  • 这有点用,至少在更多维度上是这样。但我想有些东西被交换了,见这个要点:gist.github.com/PeterTillema/215f0a6474849a06001e10804e5a6eca。我尝试根据形状交换轴 1 和 -1,但这也不起作用。
  • 更新,我想我已经解决了:我必须将最后一个轴移动到轴 1,而不是交换它们;)
猜你喜欢
  • 2018-07-06
  • 2017-09-27
  • 2011-01-22
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多