【问题标题】:Is there a way to add different arrays where some elements from one array are used repeatedly?有没有办法添加不同的数组,其中一个数组中的某些元素被重复使用?
【发布时间】:2020-12-10 17:33:58
【问题描述】:

我是 python 新手,我正在尝试找到转换数组的最佳方法。 我有两个数组,A 和 B。我想将它们加在一起,这样数组 A 的每个值都被添加到数组 B 的两个值中

A = np.array(2, 4, 6, 8, 10)
B = np.array(10, 10, 10, 10, 10, 10, 10, 10, 10, 10)

将两者结合起来会得到数组 C

C = np.array(12, 12, 14, 14, 16, 16, 18, 18, 20, 20)

我虽然也许 for 循环可能会实现这一点,但我不确定如何指定在继续之前将数组 A 的每个值应用两次。任何帮助将不胜感激,非常感谢!

【问题讨论】:

    标签: python arrays data-manipulation


    【解决方案1】:

    这有点老套,不适合初学者:

    (A[None, :] + B.reshape((2, -1))).reshape(-1)
    

    A[None, :] 将 A 视为 1x5 数组。 B.reshape((2, -1)) 将 B 视为 2x5 数组。 Python 知道如何通过广播将 1x5 数组添加到 2x5 数组。最后的 reshape 将 2x5 数组变回 10 元素数组。

    -1 在 reshape 中表示“使这个维度尽可能大以使用所有数据。”这样,我不必将 2x5 烘焙到代码中,但这适用于任何 n 元素和 2-n 元素数组。

    【讨论】:

    • 嘿。我们两个人同时发布了几乎相同的答案!几乎相同的解释!
    • 非常感谢!我会试试这个,它很有帮助,因为我的数组实际上有 100k-n 个元素长...再次感谢您!
    • 哎呀,我的意思是 2-100k 个元素。有点高兴我的问题甚至得到了任何答案,更不用说如此有用的答案了!
    • 上述解决方案适用于任何大小的数组。 .reshape() 不会复制基础数据;它创建一个新的标头,指向已经存在的数据,但将其解释为不同大小的数组。同样,如果A的每个元素都适用于B的10个元素,只需将上面的2更改为10即可。
    【解决方案2】:

    你可以reshape,添加并重新整形:

    import numpy as np
    
    A = np.array([2, 4, 6, 8, 10])
    B = np.array([10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
    
    res = (B.reshape((-1, 2)) + A[:, None]).reshape(-1)
    
    print(res)
    

    输出

    [12 12 14 14 16 16 18 18 20 20]
    

    表达式:

    B.reshape((-1, 2))
    

    创建以下数组:

    [[10 10]
     [10 10]
     [10 10]
     [10 10]
     [10 10]]
    

    基本上你告诉 numpy 将数组放入 2 by N,其中 N 的列由 B 的原始大小决定(这都是由于-1)。另一部分:

    A[:, None]
    

    创建:

    [[ 2]
     [ 4]
     [ 6]
     [ 8]
     [10]]
    

    然后使用broadcasting 可以将它们加在一起。最后重塑回来。

    【讨论】:

      【解决方案3】:

      您可以使用切片来索引 A 中的每个其他项目,然后为就地转换进行增强添加。我不知道 numpy 将如何处理切片的详细信息,但我认为这将使用最少的内存。

      B[::2] += A
      B[1::2] += A
      

      另一种扩展和重塑的方式是

      B += np.array([A, A]).flatten("F")
      

      在我看来,这将使用 A 的 4 倍大小,但我认为所有重塑方法都会占用内存。

      【讨论】:

        猜你喜欢
        • 2020-10-09
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多