【问题标题】:How to properly concat string elements in 2-d ndarray in numpy?如何在 numpy 中正确连接二维 ndarray 中的字符串元素?
【发布时间】:2019-06-16 08:08:16
【问题描述】:

在下面的代码中,我希望 arr2 返回与 lst2 相同的字符串列表,但事实并非如此。为什么lst2 和arr2 不同?是否有任何 NumPythonic 方法可以使 arr2 返回与 lst2 相同的字符串列表?

代码:

import numpy as np

lst = [['MI', '', 'P'], 
       ['B', 'N', 'SUFS'],
       ['KOS', 'XJRXA', 'JJHW'],
       ['ARI', 'TPKI', ''],
       ['VR', 'EYR', '']]

arr = np.array(lst)

arr2 = np.apply_along_axis(lambda x: "".join(x), 1, arr)
lst2 = list(map(lambda x: "".join(x), lst))

print('lst:', lst)
print('arr:', arr.tolist())
print('lst2:', lst2)
print('arr2:', arr2.tolist())

输出:

lst: [['MI', '', 'P'], ['B', 'N', 'SUFS'], ['KOS', 'XJRXA', 'JJHW'], ['ARI', 'TPKI', ''], ['VR', 'EYR', '']]
arr: [['MI', '', 'P'], ['B', 'N', 'SUFS'], ['KOS', 'XJRXA', 'JJHW'], ['ARI', 'TPKI', ''], ['VR', 'EYR', '']]
lst2: ['MIP', 'BNSUFS', 'KOSXJRXAJJHW', 'ARITPKI', 'VREYR']
arr2: ['MIP', 'BNS', 'KOS', 'ARI', 'VRE']

【问题讨论】:

  • apply_along_axis 不是对简单行迭代的改进。它并不快。

标签: python string numpy


【解决方案1】:

熊猫很容易做到:

pd.DataFrame(arr).sum(axis=1)

np.apply_along_axis() 给你带来麻烦的原因是它从第一行推断结果中字符串的长度。由于您在第一行中以 MIP 结尾,因此所有行的容量都为 3 个字符,这不是您想要的。

有一个针对 apply_along_axis() 的 NumPy 错误报告,其中包含更多信息:https://github.com/numpy/numpy/issues/8352

【讨论】:

  • 我不知道第一行决定数组的 dtype。我会考虑 pandas,但 pandas 对我来说很难......无论如何谢谢!
  • np.array(lst,object).sum(axis=1) 的工作原理与 pandas sum 的工作原理相同。 np.sum 应用于对象 dtype 数组使用对象的“+”方法,在本例中为 Python 字符串。
【解决方案2】:

谢谢。 我从https://github.com/numpy/numpy/issues/8352#issuecomment-488133970 找到了答案 .

import numpy as np

lst = [['MI', '', 'P'], ['B', 'N', 'SUFS'], ['KOS', 'XJRXA', 'JJHW'], ['ARI', 'TPKI', ''], ['VR', 'EYR', '']]
arr = np.array(lst)

arr2 = np.apply_along_axis(lambda x: np.asarray("".join(x), dtype=object), 1, arr)
# https://github.com/numpy/numpy/issues/8352#issuecomment-488133970
lst2 = list(map(lambda x: "".join(x), lst))

print('lst:', lst)
print('arr:', arr.tolist())
print('lst2:', lst2)
print('arr2:', arr2.tolist())

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 2019-03-21
    • 1970-01-01
    • 2012-04-15
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2015-05-17
    相关资源
    最近更新 更多